您的位置:首页 > 其它

HDU 4379 水题,大水,但我WA了很多次,做了很久

2013-03-28 20:26 393 查看
http://blog.csdn.net/diannaok/article/details/7875086?reload

我是看着他的写的,但是有个小错误,在初始化值时,令>L/2中最大的数的初始值为L+1较为合适,想想1 3 3 1 4

这组测试数据。

这题我再详细说一下,我们试想在子集中最大的那个数怎么取,如果取<=M/2那么所有<=M/2的数一定都可以取,但是如果取一个>M/2的数的话,那么该子集只能取一个>M/2的数,取两个的话不就不满足yi+yj <= L了嘛,如此说来,就在>M/2的数中取一个最小的,在<=M/2的数中取最大的,如果加起来<=M,则最后的sum值加1.

Attention:我本来以为用 int 存这些数就可以了,因为2*10^9不是还在 int 范围内吗?但是一直WA,一直WA,我该成long long int 之后就A了。我很想shi 啊,谁能告诉我why.同样因为上面楼主写的程序有个小小的BUG,杭电OJ未检测出来,所以,这告诫了我,有时A了也未必证明自己思维完全严谨了,没有A也不一定自己就错了,所以说啊,不要过度相信OJ 啊,要有自己的判断.

View Code

#include <cstdio>
#include <iostream>
using namespace std;
typedef long long int LL;
int main()
{
LL n,L,A,B,mod;
while(cin>>n>>L>>A>>B>>mod)
{
A %= mod;
B %= mod;
LL temp ;
LL sum = 0;
LL m= L /2;
LL t1 = 0,t2 = L+1;  //t1表示<= L/2中最大的,t2表示>L/2中最小的
temp = (A+B)%mod;
for(int i=0; i<n; i++)
{
if(temp >= mod) temp -= mod;
if(temp <= m)
{
sum++;
if(temp > t1)
t1 = temp;
}
else
{
if(temp < t2)
t2 = temp;
}
temp += A;
}
if(t1+t2<=L) sum++;
cout<<sum<<endl;
}
return 0;
}


虽然没什么必要,还是贴代码吧

再套用一句写背包九讲的DD讲的话,失败并不丢人,但没有从失败中获得什么才丢人。(貌似是这样说的吧,我在写这个程序中学到了一个新东西,哈哈)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: