HDU 4379 水题,大水,但我WA了很多次,做了很久
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
1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 typedef long long int LL; 5 int main() 6 { 7 LL n,L,A,B,mod; 8 while(cin>>n>>L>>A>>B>>mod) 9 { 10 A %= mod; 11 B %= mod; 12 LL temp ; 13 LL sum = 0; 14 LL m= L /2; 15 LL t1 = 0,t2 = L+1; //t1表示<= L/2中最大的,t2表示>L/2中最小的 16 temp = (A+B)%mod; 17 for(int i=0; i<n; i++) 18 { 19 if(temp >= mod) temp -= mod; 20 if(temp <= m) 21 { 22 sum++; 23 if(temp > t1) 24 t1 = temp; 25 } 26 else 27 { 28 if(temp < t2) 29 t2 = temp; 30 } 31 temp += A; 32 } 33 if(t1+t2<=L) sum++; 34 cout<<sum<<endl; 35 } 36 return 0; 37 }
虽然没什么必要,还是贴代码吧
再套用一句写背包九讲的DD讲的话,失败并不丢人,但没有从失败中获得什么才丢人。(貌似是这样说的吧,我在写这个程序中学到了一个新东西,哈哈)