zoukankan      html  css  js  c++  java
  • POJ 3040 贪心

    贪心好题
    ……….
    思路:
    从大到小凑C 如果不够 再从小到大补满(超过)C

    //By SiriusRen
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int n,c,ans,flag,vis[21];
    struct Money{int amount,value;}money[100];
    bool cmp(Money a,Money b){return a.value<b.value;}
    int main(){
        scanf("%d%d",&n,&c);
        for(int i=1;i<=n;i++)
            scanf("%d%d",&money[i].value,&money[i].amount);
        sort(money+1,money+1+n,cmp);
        while(1){
            memset(vis,0,sizeof(vis));
            int sum=c;
            for(int i=n;i;i--)
                if(sum>0&&money[i].amount){
                    int temp=min(money[i].amount,sum/money[i].value);
                    if(temp>0)sum-=money[i].value*temp,vis[i]+=temp;
                }
            for(int i=1;i<=n;i++)
                if(sum>0&&money[i].amount&&money[i].value>=sum){
                    sum-=money[i].value;vis[i]++;break;
                }
            if(sum>0)break;
            for(int i=1;i<=n;i++)
                money[i].amount-=vis[i];
            ans++;
        }
        printf("%d
    ",ans);
    }

    这里写图片描述
    卡时过得…
    然后我发现 诶呦 一次可以同时消很多 然后就0msAC了,,,,

    //By SiriusRen
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int n,c,ans,flag,vis[21];
    struct Money{int amount,value;}money[100];
    bool cmp(Money a,Money b){return a.value<b.value;}
    int main(){
        scanf("%d%d",&n,&c);
        for(int i=1;i<=n;i++)
            scanf("%d%d",&money[i].value,&money[i].amount);
        sort(money+1,money+1+n,cmp);
        while(1){
            memset(vis,0,sizeof(vis));
            int sum=c,temp=0x3ffffff;
            for(int i=n;i;i--)
                if(sum>0&&money[i].amount){
                    int temp=min(money[i].amount,sum/money[i].value);
                    if(temp>0)sum-=money[i].value*temp,vis[i]+=temp;
                }
            for(int i=1;i<=n;i++)
                if(sum>0&&money[i].amount&&money[i].value>=sum){
                    sum-=money[i].value;vis[i]++;break;
                }
            if(sum>0)break;
            for(int i=1;i<=n;i++){
                if(!vis[i])continue;
                temp=min(temp,money[i].amount/vis[i]);
            }
            for(int i=1;i<=n;i++){
                money[i].amount-=vis[i]*temp;
            }
            ans+=temp;
        }
        printf("%d
    ",ans);
    }

    这里写图片描述

  • 相关阅读:
    双态运维分享之:业务场景驱动的服务型CMDB
    双态运维分享之二: 服务型CMDB的消费场景
    双态运维:如何让CMDB配置维护更贴近人性
    CMDB经验分享之 – 剖析CMDB的设计过程
    APM最佳实践: 诊断平安城市视频网性能问题
    先定一个运维小目标,比方监控它10000台主机
    大规模Docker平台自动化监控之路
    少走冤枉路!带你走过SNMP的那些坑
    完整性约束
    数据类型
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532221.html
Copyright © 2011-2022 走看看