zoukankan      html  css  js  c++  java
  • 计蒜客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组
  • 相关阅读:
    脚本 var 元素,集,方法
    Android——SharedPreferences存储(作业)
    Android——ListView相关作业(修改版)
    Android——AutoCompleteTextView、Spinner和消息提示
    Android——GridView(显示文字)
    Android——GridView
    Android——BaseAdapter相关
    Android——模拟文件拷贝
    Android——计算器
    Android——ListView
  • 原文地址:https://www.cnblogs.com/littlefrog/p/11939506.html
Copyright © 2011-2022 走看看