自学内容网 自学内容网

CSP-J复赛模拟赛2————赵义弘补题报告

一.题目目录

     

T1简单的问题
T2寻找“五维空间”
T3约定
T4遗忘的过去

二.模拟赛题目期望得分

T1:100

T2:   60

T3:   60

T4:   80

   因为蒟蒻自己没有参加这场模拟赛,所以就只有期望得分了

三.比赛分析

T1:[简单的问题(problem)]

      题目大意:给你一个分段函数求它的一些对应的函数值

      

       思考过程:读了一遍题以后发现这道题的数据范围
对于30%的数据,𝑥≥101
另外40%的数据,𝑥≤10
对于100%的数据,𝑥≤1000000
如果你想要AC一定要将cin和cout改成scanf和printf

同时蒟蒻我看了一下上面的题目描述和输入和输出样例,发现:如果x是小于等于100时,那么输出的答案一定是91。如果x是大于等于101时输出的答案一定是x-10
 代码实现(由于蒟蒻我的辟谷报废了,所以蒟蒻我是现写的代码,写的可能不大好)
#include<bits/stdc++.h>
using namespace std;
int main(){
int x;
while(~scanf("%d",&x)&&x!=0){
if(x>=101) printf("%d\n",x-10);
else printf("91\n",91);
}
return 0;
}

我觉得是T1题因该不会有人AC不了吧

T2:[寻找“五维空间”(space)]

       题目大意:帮助两个帅哥(小A和小C)找到要求的最简真分数。
       思考过程:在看到这个样例的蒟蒻我都蒙了,这啥呀

仔细一看后我发现199/299约等于三分之二,也就是输入样例的第一行,至于输入样例的第二行则是输出样例的两个数所在的区间范围,那了解样例后的蒟蒻我就是无敌的。(后面会打脸)

代码实现:

自信的蒟蒻提交了代码

自信的蒟蒻寄了(只有60分)

毕竟失败乃成功他娘,错误代码也是要放出来的

#include<bits/stdc++.h>
using namespace std;
int x,y;
int n,d,m;
int ans=1.0*100000000000;
int X,Y;
int inf;
int gcd(int x,int y){
    if(y==0) return x;
    gcd(y,x%y);
}
bool check(int x,int y){
    if(x==n&&y==d) return 0;
    if(gcd(x,y)!=1) return 0;
    return 1;
}
int main(){
    cin>>n>>d>>m;
    double p=1.0*n/d;
    double ans=inf;
    for(int x=1;x<m;x++){
        for(int y=x+1;y<=m;y++){
            if(check(x,y)){
                double now=1.0*x/y;
                if(abs(ans-p)>abs(now-p)){
                ans=now;
X=x;
Y=y; 
}
            }
        }
    }
    cout<<X<<" "<<Y<<endl;
    return 0;
}

再听完老师对这道题目的细致讲解后,我应该理解了(但是我的代码还没有改完,所以放的是60分的代码,可恶的TLE)

T3:[约定(agreement)]

      题目大意:神秘人(姑且叫他小s吧)需要知道通过尝试不同的排列最多能够获得多少灵力值(一种排列恰好有 𝑘 个“有效关系”,那么摆出这样的排列就能提供 1点灵力值,同一种排列只会提供一次灵力值)
      由于这个问题的答案可能非常的大,小A根本算不明白,而小s只会魔法,于是小A希望你能帮他解决这个问题。答案对2012取模
      思考过程:先看样例

   

       从样例中我们得知了输入样例的第一个为n(3)张魔法牌,而输入样例中的第二个则告诉我们了一共有k(1)种“有效关系”。从输出样例中我们知道了对于输出样例来说共有四种排列的结果,分别是[3,1,2],[2,1,3],[1,3,2],[2,3,1]而这四种排列的结果只有一个“有效关系”,所以输出4.
代码实现:
蒟蒻我在老师的讲解下,完成了这道题目
#include<bits/stdc++.h>
using namespace std;
int n,k;
int dp[1005][1005];
int main(){
    cin>>n>>k;
    for(int i=0;i<=n;i++) dp[i][0]=1;
    for(int i=1;i<=1000;i++){
    for(int j=1;j<=1000;j++){
            dp[i][j]=dp[i-1][j-1]*(i-j)+dp[i-1][j]*(j+1);
            dp[i][j]%=2012;
        }
} 
    cout<<dp[n][k];
    return 0;
}

一定要注意要把dp这个数组初始化一下,否则就会直接输出0

加上那个dp[i][0]=1,就能过了

T4[遗忘的过去(forget)]

题目大意:蒟蒻我感觉很像d4的supermarket,好像就改了个样例和输入和输出,实话说看supermarket好像懂得更快,推荐去看d4的supermarket

废话不多说,直接上代码

#include<bits/stdc++.h>
using namespace std;
const int N=100005; 
priority_queue<int,vector<int>,greater<int> > qu;
int n,cnt=0;
struct node{
int maxt,v;
}a[N];
bool cmp(node x,node y){
if(x.maxt==y.maxt) return x.v<y.v;
return x.maxt<y.maxt;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].maxt;
}
for(int i=1;i<=n;i++){
cin>>a[i].v;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
qu.push(a[i].v);
if(qu.size()>a[i].maxt){
qu.pop();
}
}
while(!qu.empty()){
cnt+=qu.top();
qu.pop();
}
cout<<cnt;
return 0;
}


原文地址:https://blog.csdn.net/djsjsyajsg/article/details/140635465

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!