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;
}
回到正题,还是让我们回过头来看看这道题,英文题目不粘了,粘了估计也没人看,题目大意:有三个人参加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;
}
相关文章推荐
- poj 2497 Strategies 模拟水题
- poj 2497 Strategies 模拟
- POJ 3652 Persistent Bits 简单字符串模拟
- POJ 3032 简单队列模拟
- Parencodings(poj1068简单模拟)
- (简单模拟——筛选法模拟2.2.1)POJ 1316 Self Numbers(生成数、自数)
- (简单模拟2.4.1)POJ 2000 Gold Coins(确定大数字序列中的某一位置在小数字序列中的位置)
- POJ 2453 简单模拟
- poj 3792 Area of Polycubes (简单模拟)
- poj 1573 简单模拟
- poj 1552 Doubles(简单的模拟一下)
- poj 1103 & zoj 1142 Maze (图形模拟+简单搜索)
- POJ 3032 简单队列模拟
- POJ 1573 Robot Motion(简单模拟)
- POJ1318 Word Amalgamation 简单模拟
- poj 1002 487-3279 ((含易错点、测试数据) 简单模拟 )
- POJ 3652 Persistent Bits 简单字符串模拟
- POJ1250 Tanning Salon 简单模拟
- POJ 1573 && hdu 1035(简单模拟)
- (简单模拟2.4.3)POJ 2864 Pascal Library(某一个环节的值决定全局的值)