74分求助

P1208 [USACO1.3] 混合牛奶 Mixing Milk

我也是这个问题,需要特判 ```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


|