PAT_乙级_C++|贪心算法|1020 月饼 (25分)1023 组个最小数 (20分)问题 A: 看电视 问题 B: 出租车费

贪心法是求解一类最优化问题的方法,
它总是考虑在当前状态下局部最优的策略。
越小越好
越大越好

结构体—库存、总售价、单价
求单价—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",&times[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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值