HDU 4379 The More The Better

20 篇文章 0 订阅

           真是个奇葩的题目!卡了N次。

            1.并不一定是连续的子串,这个题相当于从n个数中挑出符合条件的数。

           2.很容易超时,我超时的原因是用了 maxx=max(maxx,num);而换成 maxx=maxx>num?maxx:num;就不会超时。

           3.思路:找出的子串中任意的两个相加都<=L,那么子串中最多有一个数超过L,方法就是求出所有<=L/2的数的个数,并且记录下<=L/2的数中最大的,即maxx,以及>L/2的数中最小的一个即minn,最后如果minn+maxx<=L,答案加1.

           4.如果  maxx=-0xffffff;    minn=0xffffff;这样初始化会是WA。(因为0xffffff是16777215,0x7fffffff=2147483647)

     5.关于minn和maxx初始化,一开始以为minn初始化为mod大小就可以了,但是如果整个长度为n序列中所有的长度都小于 L/2,也就是说在这条 if(mina+maxa<=l)  语句中mina的值就是初始值,加入初始值是mod的话 那么 mina+maxa=mod+maxa可能会小于L从而执行 sum++,可此时是没有大于L/2的元素的。所以可以初始化为minn=L+2;maxx=-1;


AC代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    // freopen("in.txt","r",stdin);
    long long int n,L,a,b,mod,ans,num,maxx,minn;
    while(cin>>n>>L>>a>>b>>mod)
    {
        ans=0;
        maxx=-2000000000;
        minn=1100000000000;
        // maxx=-0xffffff;  //WA
        // minn=0xffffff;  //WA
        for(long long int i=1; i<=n; i++)
        {
            num=(a*i+b)%mod;
            if(num<=L/2)
            {
                ans++;
                //maxx=max(maxx,num);//这样写会TLE

                maxx=maxx>num?maxx:num;
            }
            else
                //minn=min(minn,num);//这样写会TLE
                minn=minn<num?minn:num;
        }
        if(maxx+minn<=L)
            ans++;
        cout<<ans<<endl;
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值