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 已听懂