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讲的话,失败并不丢人,但没有从失败中获得什么才丢人。(貌似是这样说的吧,我在写这个程序中学到了一个新东西,哈哈)

原文地址:https://www.cnblogs.com/allh123/p/2987508.html