贪心法是求解一类最优化问题的方法,
它总是考虑在当前状态下局部最优的策略。
越小越好
越大越好
结构体—库存、总售价、单价
求单价—double----scanf("%lf")------printf("%.2f")
将月饼种类按单价从高到低排序–sort—cmp
需求>某类或者需求<=某类(break;需求太小了,就跳出,满足了)----循环
#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;
int D;
scanf("%d%d",&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++){//cake[0].price>cake[1].price>cake[2].price
if(cake[i].store<=D){//如果需求高于某类月饼
D-=cake[i].store;//第i类月饼全部卖出
ans+=cake[i].sell;
}else{//如果月饼库存量高于需求量
ans+=cake[i].price*D;//买需求量的月饼
break;
}
}
printf("%.2f",ans);
return 0;
}
第一位放除了0以外的存在的最小数
后面的数字放能放最小的数字放最小的数字
# include<cstdio>
int main(){
int times[10];
for(int i=0;i<10;i++){
scanf("%d",×[i]);
}
for(int i=1;i<10;i++){
if(times[i]>0){
printf("%d",i);
times[i]--;
break;
}
}
for(int i = 0;i<10;i++){
for(int j = 0;j<times[i];j++){
printf("%d",i);
}
}
return 0;
}
https://www.cnblogs.com/dchnzlh/p/10427309.html
节目要最多,结束要最早
// #include <algorithm>
// #include <cstdio>
// using namespace std;
// const int maxn = 110;
// struct Inteval{
// int x,y;
// }I[maxn];
// bool cmp(Inteval a,Inteval b){
// if(a.y!=b.y)return a.x>b.x;
// else return a.y<b.y;
// }
// int main(){
// int n;//开区间个数
// while(scanf("%d",&n),n!=0){
// for(int i = 0;i<n;i++){
// scanf("%d%d",&I[i].x,&I[i].y);
// }
// sort(I,I+n,cmp);
// //ans记录不相交区间的个数,lastX记录上一个被选中区间的左端点
// int ans = 1,lastX = I[0].x;
// for(int i = 1;i<n;i++){
// if(I[i].y<=lastX){//如果该区间右端点在lastX区间
// lastX=I[i].x;//以I[i]作为新选中的区间
// ans++;
// }
// }
// printf("%d\n",ans);
// }
// return 0;
// }
#include <algorithm>
#include <cstdio>
using namespace std;
const int maxn = 110;
struct Inteval{
int x,y;
}I[maxn];
bool cmp(Inteval a,Inteval b){
if(a.y!=b.y)return a.y<b.y;
else return a.x>b.x;
}
int main(){
int n;//开区间个数
while(scanf("%d",&n),n!=0){//while(scanf("%d",&n),n)
for(int i = 0;i<n;i++){
scanf("%d%d",&I[i].x,&I[i].y);
}
sort(I,I+n,cmp);
//ans记录不相交区间的个数,lastX记录上一个被选中区间的左端点
int ans = 1,lasty = I[0].y;
for(int i = 1;i<n;i++){
if(I[i].x>=lasty){//如果该区间右端点在lastX区间
lasty=I[i].y;//以I[i]作为新选中的区间
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}
/*
就是当输入一个整型,且这个整型的数不是0时,条件成立,
否则,若输入0,则跳过while里面的内容。
其实scanf("%d",&n),n这是一个逗号表达式,所谓逗号表达式,它的值是逗号后面的那个数,
举例如下:
y=(5,6);
//那么y=6,注意的是因为逗号表达式的优先级比赋值运算还低,所以如果你写成y=5,6的话y还是等于5的
也就是说while(scanf("%d",&n),n)其实相当于while(n),只是因为要输入所以写成了while(scanf("%d",&n),n)这样而已
scanf("%d",&n),n 这是逗号表达式,表达式的值取决于最后一个n的值,c中将0视为false,将非0视为true;所以它们等价。
*/
//① 低于4公里,都是10元。
//② 大于4小于等于8,自然是不必换车,是10+(n-4)×2元。
//③ 大于8小于等于12时,不下车会便宜一点,是18+(n-8)×2.4元。
//④ 大于12小于等于16时,走8公里换车便宜一点,是18+10+(n-4)×2元。
//⑤ 大于16时,则重新进行③或④的选择,即如果够8公里,则加18元,直到减去很多个8公里后剩下的路程小于等于8公里。如果剩下的路程小于等于4,则选择继续坐,不换车,费用加上(n-8)×2.4元;如果大于4小于等于8,则换车,费用加上10+(n-4)×2元。
//当不超过4公里的时候,毫无疑问我们最少花10块
//当不超过8公里的时候,毫无疑问我们最少花10+(n-4)*2块
//当超过8公里,我们就要选择要不要换车,具体看超过8公里的公里数来决定
//当不超过12公里的时候,毫无疑问我们最少花18+(n-8)*2.4块
//当不超过16公里的时候,换车便宜,18+10+(n-8)*2块.....
#include <cstdio>
int main(){
int n;
while(scanf("%d",&n),n!=0){
double sum=0.0;
if(n<=4)sum=10;
if(n>4&&n<=8)sum=10+2*(n-4);
if(n>8){
while(n>=8){
sum+=18;
n-=8;//8
}
if(n<=4){
sum+=2.4*n;
}else{
sum+=10+(n-4)*2;
}
}
if(sum-(int)sum==0)printf("%d\n",(int)sum);
else printf("%.1f\n",sum);
}
return 0;
}