我也是这个问题,需要特判
```cpp
1.if(n==0){
cout<<0;
return 0;
}
```
```cpp
2.if(m==1){
cout<<n*a[1].x;
return 0;
}
```
(虽然我也不知道为什么)
by I_Flipped @ 2021-05-17 21:21:49
@[I_Flipped](/user/497333) (代码略有不同,见谅)
```cpp
#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
struct pp{
int x,y;
}a[5001];
bool cmp(pp x,pp y){
return x.x<y.x;
}
int main(){
cin>>n>>m;
if(n==0){
cout<<0;
return 0;
}
for(int i=1;i<=m;i++)cin>>a[i].x>>a[i].y;
if(m==1){
cout<<n*a[1].x;
return 0;
}
sort(a+1,a+m+1,cmp);
for(int i=1;;i++){
if(n-a[i].y>=0){
n-=a[i].y;
ans+=a[i].x*a[i].y;
}
else{
ans+=a[i].x*n;
break;
}
}
cout<<ans;
return 0;
}
```
by I_Flipped @ 2021-05-17 21:23:46
@[I_Flipped](/user/497333)
第二个特判,其实并不准确。比如下面的数据就可以 hack 掉。
```
4 2
10 2
5 2
```
用这个数据为例,在循环里面,由于 $a[1].y$ 和 $a[2].y$ 加起来刚好等于 $n$,所以在 $i=2$ 的时候,并没有被 ``break`` 掉,所以在循环里面 $i$ 会进入到 $3$。此时 $n$ 由于减去了 $a[1].y$ 和 $a[2].y$,刚好就等于 $0$,由于这时候 $a[3].y$ 也等于 $0$,所以此时 ``n-a[i].y>=0`` 恒成立,故 $i$ 的值会不断加直到溢出。
$n=0$ 的那个特判也同理
解决方法也很简单,在 for 那里循环终止条件加上 $i<=m$ ,或者把 ``n-a[i].y>=0`` 改成 ``n-a[i].y>0`` 就可以 AC 了。
BTW,其实楼主错的不是这个内容 qwq。
by Dian_Jiao @ 2021-06-10 22:03:26
@[是青白呀](/user/359270)
第一个错的地方在第 $18$ 行的 ``for`` 那里,应该是 ``for(int i=1;i<=m;i++)``,是 ``m`` 不是 ``n``,因为是奶农的个数。
然后,第 $22$ 行 ``money+=c[i].price*(c[i].num-n)`` 应为 ``money+=c[i].price*n``,因为当这位奶农提供的牛奶大于你需要买的牛奶的数量时,要买的应该是你还需要买的的牛奶的数量 $n$,而不是全买多出来的牛奶的数量。
改完这两个就可以 AC 了 QwQ
by Dian_Jiao @ 2021-06-10 22:11:45
@[Dian_Jiao](/user/90973) 膜大佬qwq
by 是青白呀 @ 2021-06-11 13:41:58