查看原题:
初步思路:
- 采用贪心法求解,贪心策略如下:
- 排序,优先买最便宜的。
- 累加总数
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组 |