NOIP2012 提高组 复赛 day1 game
1、题目读下来,直到纯粹的穷举法,肯定要越界。2、没有更好的办法时,快速有效竟可能的得更多分是第一要素。
3、只是简单考虑将大臣按右手数据由小到大排队,当然肯定考虑不周全,但是没有更好的办法。
4、考虑到数据量,尽可能保证代码好写的情况下,采用冒泡排序,没有采用快速排序。
5、代码很快就编写成功,从读题到编写出代码前后所花时间也就半小时。
6、预测10组测评数据,能通过6组,得60分。
7、实测10组测评数据,通过5组,得50分。
8、对以上结果还是十分满意的。
编译环境Dev-C++4.9.9.2
附上代码:
//Teacher 陈 代码 2016年8月25日
//NOIP2012 提高组 复赛 day1 game
//估计10组测评数据能有6组通过,60分,目前想不更好的办法,权益之计
//经复赛10组测评数据,通过5组,50分。在没有更好思路时,用当前思路,得分是第一位。
#include <stdio.h>
struct node{
int a;
int b;
};
const int maxn=1000+10;
struct node data[maxn],t;
int ans[maxn];
int main(){
FILE *fin,*fout;
int n;
int i,j,tmp;
fin=fopen("game.in","rb");
fout=fopen("game.out","wb");
fscanf(fin,"%d",&n);
fscanf(fin,"%d%d",&data[0].a,&data[0].b);
for(i=1;i<=n;i++)
fscanf(fin,"%d%d",&data[i].a,&data[i].b);
for(i=1;i<=n;i++)//按右手自小到大排序
for(j=i+1;j<=n;j++){
if(data[i].b>data[j].b){
t=data[i];
data[i]=data[j];
data[j]=t;
}
}
for(i=1;i<=n;i++){//计算每位大臣分配到的金币
ans[i]=1;
for(j=0;j<i;j++){
ans[i]*=data[j].a;
}
ans[i]/=data[i].b;
}
for(i=1;i<=n;i++)//将答案自大到小排序
for(j=i+1;j<=n;j++){
if(ans[i]<ans[j]){
tmp=ans[i];
ans[i]=ans[j];
ans[j]=tmp;
}
}
fprintf(fout,"%d\n",ans[1]);
fclose(fin);
fclose(fout);
return 0;
}