注意点:一处代码用while循环,导致一个测试点段错误,总结发现是因为出现了死循环,当市场最大需求量D足够大时,导致代码运行不到含break的if语句里,从而无法通过break来终止.因此最好将while改成for,当遍历到最后一种月饼时还未退出循环,可自动结束循环.
#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<math.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<algorithm>
struct node{
double amounts;
double totalPrice;
double singlePrice;
}cake[1010];
bool cmp(node a,node b){
return a.singlePrice>b.singlePrice;
}
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int n,idx=0;
double d,res=0;
scanf("%d%lf",&n,&d);
for(int i=0;i<n;i++){
scanf("%lf",&cake[i].amounts);
}
for(int i=0;i<n;i++){
scanf("%lf",&cake[i].totalPrice);
cake[i].singlePrice=cake[i].totalPrice/cake[i].amounts;
}
sort(cake,cake+n,cmp);
while(1){
if(cake[idx].amounts<=d){
d-=cake[idx].amounts;
res+=cake[idx++].totalPrice;
}else{
res+=cake[idx].singlePrice*d;
break;
}
}
printf("%.2f",res);
return 0;
}
while改成for:
#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<math.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<algorithm>
struct node{
double amounts;
double totalPrice;
double singlePrice;
}cake[1010];
bool cmp(node a,node b){
return a.singlePrice>b.singlePrice;
}
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int n;
double d,res=0;
scanf("%d%lf",&n,&d);
for(int i=0;i<n;i++){
scanf("%lf",&cake[i].amounts);
}
for(int i=0;i<n;i++){
scanf("%lf",&cake[i].totalPrice);
cake[i].singlePrice=cake[i].totalPrice/cake[i].amounts;
}
sort(cake,cake+n,cmp);
for(int idx=0;idx<n;idx++){
if(cake[idx].amounts<=d){
d-=cake[idx].amounts;
res+=cake[idx].totalPrice;
}else{
res+=cake[idx].singlePrice*d;
break;
}
}
printf("%.2f",res);
return 0;
}