贪心
程序员文章站
2022-06-13 12:31:40
...
局部最优
待补
接月饼
#include <cstdio>
#include <algorithm>
using namespace std;
struct mooncake{
double store;//库存量
double sell;//总售价
double price;//单价
}cake[1010];
bool cmp(mooncake a,mooncake b){
return a.price>b.price;
}
int main(){
int n;
double D;
scanf("%d %lf",&n,&D);
for(int i=0;i<n;i++){
scanf("%lf",&cake[i].store);
}
for(int i=0;i<n;i++){
scanf("%lf",&cake[i].sell);//输入结束
cake[i].price = cake[i].sell/cake[i].store;//求单价
}
sort(cake,cake+n,cmp);//排完序后数组第一个是单价最高的,先卖这个
double ans = 0;//收益
for(int i=0;i<n;i++){
if(cake[i].store<=D){
D-=cake[i].store;
ans += cake[i].sell;
}else{
ans += cake[i].price*D;//当库存量高于需求量D时,直接计算收益就行 不用令需求量为0,
break;//记得将循环中断
}
}
printf("%.2f\n",ans);//精确到小数点后两位
return 0;
}
思路:求出单价后 按单价高低排序,如果库存小于需求,先卖单价最高的,再依次找次高的,每次把卖掉的需求减掉。
如果库存大于需求 那直接按需求量卖掉就好了,直接求价钱就行
#include <cstdio>
int main(){
int count[10];
for(int i=0;i<10;i++){
scanf("%d",&count[i]);
}
for(int i=1;i<10;i++){
if(count[i]>0){
printf("%d",i);
count[i]--;//把输出的这个首位减掉一个
break;
}
}
for(int i=0;i<10;i++){
for(int j=0;j<count[i];j++){
printf("%d",i);
}
}
return 0;
}
思路:从1-9选其中不为零的数中最小的那个做首位。然后从0-9依次选最小的顺序输出,注意要嵌套循环输出。 推荐阅读