您的位置:首页 > 其它

POJ 2497 Strategies 简单模拟

2014-11-29 11:00 295 查看
    又是一道模拟题,我感觉模拟题的特点就是看起来很简单,做起来又比较麻烦,主要是细节部分,不找张纸画画就能做出来的绝对是大神,至少我不是。。。这道模拟题做了一上午,一直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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息