• 计蒜客T1846AC记


    查看原题:

    原题地址

    初步思路:

    1. 采用贪心法求解,贪心策略如下:
      1. 排序,优先买最便宜的。
      2. 累加总数ans

    初步代码:

    (楼主评语:其实其他地方的编程实现不太重要,贪心策略才是问题)

    #include <bits/stdc++.h>
    using namespace std;
    struct d
    {
        int price,num;
    } goods[123456];
    bool cmp(d a,d b)
    {
        return a.price<b.price;
    }
    int main()
    {
        int m,n;
        scanf("%d %d",&m,&n);
        for(int i = 0; i<n; ++i)
        {
            scanf("%d %d",&goods[i].price,&goods[i].num);
        }
        sort(goods,goods+n,cmp);
        int ans = 0;
        for(int i = 0; i<n; ++i)
        {
            if(m) {
                int tmp = goods[i].price*goods[i].num;
                if(tmp<=m) {
                    m-=tmp;
                    ans+=goods[i].num;
                } else {
                    ans+=goods[i].price/m;
                }
            }
            //printf("%d %d
    ",goods[i].price,goods[i].num);
        }
        printf("%d",ans);
        return 0;
    }

    评测结果

    类型 组数
    样例数据 1组
    AC 3组
    WA 7组

    推测原因

    推测是在

    if(m) {
        int tmp = goods[i].price*goods[i].num;
        if(tmp<=m) 
            m-=tmp;
            ans+=goods[i].num;
        } else {
            ans+=goods[i].price/m;
        }
    }

    部分出了问题,这一部分正是决定我们“买不买”,“买多少”的部分。

    else中累加的有问题,不应是此种商品的价格/m,另外m还没动呢,答案怎么会对呢?(逃...

    于是,我请教了一下,得到的结果:

    else 的时候能买的数量是当前的钱数 m 除以每件的 price 减少的钱就是这个数量再乘每件的 price。

    改正代码:

    #include <bits/stdc++.h>
    using namespace std;
    struct d
    {
        int price,num;
    } goods[123456];
    bool cmp(d a,d b)
    {
        return a.price<;b.price;
    }
    int main()
    {
        int m,n;
        scanf("%d %d",&m,&n);
        for(int i = 0; i<;n; ++i)
        {
            scanf("%d %d",&goods[i].price,&goods[i].num);
        }
        sort(goods,goods+n,cmp);
        int ans = 0;
        for(int i = 0; i<n; ++i)
        {
            if(m) {
                int tmp = goods[i].price*goods[i].num;
                if(tmp<=m) {
                    m-=tmp;
                    ans+=goods[i].num;
                } else {
                    ans+=m/goods[i].price;
                    m-=ans*goods[i].price;
                }
            }
            //printf("%d %d
    ",goods[i].price,goods[i].num);
        }
        printf("%d",ans);
        return 0;
    }

    以上是改正代码。

    评测结果:

    样例都没过哪来的评测结果???

    如上,代码没有通过样例

    推测原因:

    再次去请教,有人告诉我:

    m -= m / goods[i].price * goods[i].price ans 是累加的不是这一次买的啊,这一次买的数量是 m / goods[i].price

    改正代码:

    #include <bits/stdc++.h>
    using namespace std;
    struct d
    {
        int price,num;
    } goods[123456];
    bool cmp(d a,d b)
    {
        return a.price<b.price;
    }
    int main()
    {
        int m,n;
        scanf("%d %d",&m,&n);
        for(int i = 0; i<n; ++i)
        {
            scanf("%d %d",&goods[i].price,&goods[i].num);
        }
        sort(goods,goods+n,cmp);
        int ans = 0;
        for(int i = 0; i<n; ++i)
        {
            if(m) {
                int tmp = goods[i].price*goods[i].num;
                if(tmp<=m) {
                    m-=tmp;
                    ans+=goods[i].num;
                } else {
                    ans+=goods[i].price/m;
                }
            }
            //printf("%d %d
    ",goods[i].price,goods[i].num);
        }
        printf("%d",ans);
        return 0;
    }

    测评结果:

    类型 组数
    样例数据 通过
    AC 10组
  • 相关阅读:
    [转]MSI安装程序中的文件替换
    运行时使用Dev的ImageListEditor
    openswan-ipsec.conf配置说明
    【辅导】Task19 实现用户登录 主要知识点
    【辅导】Task18 更新与插入删除操作 主要知识点
    【辅导】Task17 查询数据 主要知识点
    【辅导】Task16 使用MySQL数据库 主要知识点
    【辅导】Task15 熟悉错误与异常处理 主要知识点
    【辅导】Task14 使用正则表达式 主要知识点
    【辅导】Task13 使用会话管理 主要知识点(2)
  • 原文地址:https://www.cnblogs.com/littlefrog/p/11939506.html
Copyright © 2020-2023  润新知