计蒜客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组
原文地址:https://www.cnblogs.com/littlefrog/p/11939506.html