2017.12.03
贪心
1.金银岛
思路:既然每一种金属都是可以任意切割的,那么就可以先求出每一种金属的单位价值,把它进行排序,从单位价值最大的开始装起,只要背包还有空间就全部装进背包,如果装不完就把剩下的空间全部装这种物体。
for(i=1;i<=s;i++){ scanf("%lf%lf",&gold[i][1],&gold[i][2]); gold[i][3]=gold[i][2]/gold[i][1]; } for(i=1;i<s;i++){ int sortmax=i; for(j=i+1;j<=s;j++){ if(gold[sortmax][3]<gold[j][3]) sortmax=j; } if(sortmax!=i){ double t; t=gold[i][1];gold[i][1]=gold[sortmax][1];gold[sortmax][1]=t; t=gold[i][2];gold[i][2]=gold[sortmax][2];gold[sortmax][2]=t; t=gold[i][3];gold[i][3]=gold[sortmax][3];gold[sortmax][3]=t; } } for(i=1;i<=s&&w>0;i++){ if(w>=gold[i][1]){ w-=gold[i][1]; max+=gold[i][2]; } else if(w<gold[i][1]){ max+=gold[i][3]*w; w=0; } } printf("%.2f\n",max);
状态:AC
2.An easy problem
思路:要求最小的与题中所给的数I转换成为二进制后所含‘1’的数目相同,就可以先用一个常量保存I的含‘1’值,从I+1开始,每次都判断一下它的含‘1’数量是否和I相等,就可以求出最小的数。
核心代码:
int wen(int k){ int one=0; while(k){ if(k%2==1)one++; k/=2; } return one; }
状态:AC
3.Ride to Office
思路:首先他如果是一定要跟一个人,那么在他以前出发的人就可以不再考虑。再输入完后就可以去掉。再者,既然他会总是不断跟着最快的人,可以直接扫一遍,选出时间最短的那个人,它所用的时间就是那个人所用的时间。
核心代码:
for(int i=1;i<=n;i++){ scanf("%lf%lf",&v,&t); if(t>=0){ m=4.5/v*3600+t; if(m<minn)minn=m; } } printf("%d\n",int(minn+0.99));
状态:AC
4.书架
思路:既然要用最少的牛数,那每第i次选择,肯定要选剩下的牛中最高的。即扫一遍排序后从大的选起。与金银岛类似。
状态:AC
5.装箱问题
思路:从最大的6*6箱子装起,先装大的,再装小的(在一个大箱子里也遵循这个原理)。可以画图来模拟一下,特别要注意3*3箱子是有多种方法放置的。最后用can1,can2来表示可以装1*1,2*2箱子的数量。
核心代码:
if (a3>0){ sum++; if (a3==1) { can1+=7; can2+=5; } else if (a3==2) { can1+=6; can2+=3; } else { can1+=5; can2+=1; } }
状态:未AC 已听懂
时间: 2024-10-29 19:11:53