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

  • 相关阅读:
    微信报警提示
    使用pygal图表显示网站API接口数据
    读写文本文件,乱码解决方案
    MD5加密
    将DataTable导入到SQL数据库表中
    NPOI组件操作Excel导入、导出
    二叉树由先序和中序建树
    用两个栈模拟队列
    math type白嫖教程
    IDEA常用快捷键
  • 原文地址:https://www.cnblogs.com/allh123/p/2987508.html
Copyright © 2020-2023  润新知