又是一道模拟题,我感觉模拟题的特点就是看起来很简单,做起来又比较麻烦,主要是细节部分,不找张纸画画就能做出来的绝对是大神,至少我不是。。。这道模拟题做了一上午,一直WA,究其原因,只因为我使用了一个超长的if(),不要问我多长,至少可以亮瞎24K氪金狗眼
回到正题,还是让我们回过头来看看这道题,英文题目不粘了,粘了估计也没人看,题目大意:有三个人参加ACM比赛,他们三个人有不同的做题策略,
Bill:按照题目的顺序一道一道做;
Steve:按照先以后难的顺序做;
Linus:按照先难后易的顺序做;
然后题目会给出每一场测试的时间和题目的个数,以及每道题目每个人要花多长时间才能做出来,
得分计算标准:从比赛开始到某道题目被做出来的时间段为这道题目的得分
赢的标准:首先看谁做出的题目多,一样多看得分少的,得分也一样就让Steve赢
最后输出赢得人做出的题目数以及得分。
看似好像很简单,其实就是很简单,但有几个地方需要注意:
1.在计算所能做出的题目总数的时候,你要判断的条件是每道题目所花的时间之和,即总时间
2.在计算得分的时候,你要累加的是每道题目从比赛开始到做出来所用的时间,比如第一道题目做出来要用时间T1,第二道题目做出来要用时间T2,那么做出第二道题的得分为T1+T2
3.不管你用什么方式做(我是用的结构体),要注意变量的初始化
4.针对本道题目,在最后进行结构体排序的时候,有一个小技巧,因为题目说如果做出的题目数和得分都一样就让Steve赢,那么也可以理解为名字作为第三个判断条件,正好Steve这个名字在字典序中是最大的,所以可以进行判断。
最后,上代码,写的不是很好,要是哪里可以优化欢迎评论
#include<iostream> #include<string> #include<algorithm> using namespace std; struct People { string name; int solvepro; int score; }peo[3]; int cmp(int i,int j) { if(i>j) return 1; return 0; } int cmp1(People p1,People p2) { if(p1.solvepro>p2.solvepro) return 1; else if(p1.solvepro==p2.solvepro) { if(p1.score<p2.score) return 1; else if(p1.score==p2.score) if(p1.name>p2.name) return 1; } return 0; } int main() { int T,i,j; cin>>T; for(i=1;i<=T;i++) { peo[0].name="Bill"; peo[1].name="Steve"; peo[2].name="Linus"; int time,pronum,score=0,sum,time0=0; cin>>time>>pronum; int *dif=new int[pronum]; int *dif0=new int[pronum]; for(j=0;j<pronum;j++) { cin>>dif[j]; } for(j=0;j<pronum;j++) { dif0[j]=dif[j]; } sum=0; for(j=0;j<pronum;j++) { dif0[j]=sum+dif0[j]; sum=dif0[j]; } time0=0; score=0; for(j=0;j<pronum;j++) { if((time0+dif[j])>time) break; else { score=score+dif0[j]; time0=time0+dif[j]; } } peo[0].solvepro=j; peo[0].score=score; sort(dif,dif+pronum); for(j=0;j<pronum;j++) { dif0[j]=dif[j]; } sum=0; for(j=0;j<pronum;j++) { dif0[j]=sum+dif0[j]; sum=dif0[j]; } time0=0; score=0; for(j=0;j<pronum;j++) { if((time0+dif[j])>time) break; else { score=score+dif0[j]; time0=time0+dif[j]; } } peo[1].solvepro=j; peo[1].score=score; sort(dif,dif+pronum,cmp); for(j=0;j<pronum;j++) { dif0[j]=dif[j]; } sum=0; for(j=0;j<pronum;j++) { dif0[j]=sum+dif0[j]; sum=dif0[j]; } time0=0; score=0; for(j=0;j<pronum;j++) { if((score+dif[j])>time) break; else { score=score+dif0[j]; time0=time0+dif[j]; } } peo[2].solvepro=j; peo[2].score=score; sort(peo,peo+3,cmp1); cout<<"Scenario #"<<i<<":"<<endl; cout<<peo[0].name<<" wins with "<<peo[0].solvepro<<" solved problems and a score of "<<peo[0].score<<"."<<endl; cout<<endl; } return 0; }