Codeforces Round #645 (Div. 2) 重点:D:The Best Vacation

题目链接:点这里

D. The Best Vacation

题意:一年有n个月,每个月有di天,给你len天假期,如果在每个月的第j天拜访他人就会获得j个拥抱,让你最大化拥抱。
解题思路:主流思路叫做双指针,但是不是双指针的那种典型的写法。首先做这道题之前需要证明一下,假期选择天数的结尾一定是每个月的结尾天数。这是个非典型推论,我们来证明一下,首先上一下cf的证明
首先使用的是反证法,首先设结尾为x,结尾的右边是x+1(因为如果不是这样的话,结尾就是月份的结尾)现在想使左移的值大于右移的值,那么若成立,便可以一直左移,所以不是最优解;
既然知道了一定是在月末买,那我们可以轻松知道往前二分查找起点再把溢出的天数加一加,便可一切明了。
主要还是难在月末这个点 的贪心。

LL a[N];
int main(){
    int n ;
    LL len ;
    while(~scanf("%d %lld", &n , &len)){
        for(int i = 1; i <= n ; i ++){
            scanf("%lld" ,&a[i]);
            a[i+n] = a[i];
        }
        n *= 2;
        vector<LL> B={0},C={0};
        for(int i = 1; i <= n ;i ++){
            B.pb(B.back()+a[i]);
            C.pb(C.back()+a[i]*(a[i]+1)/2);
        }
        LL ans = 0;
        for(int i = 0 ; i < n ; i ++){
            if(B[i+1] >= len){
                int pos = upper_bound(B.begin(),B.end(),B[i+1]-len) - B.begin();
                LL cnt = C[i+1] - C[pos];
                LL day = B[i+1] - B[pos];
                LL more =  len - day;
                cnt += (a[pos]*(a[pos]+1)/2);
                cnt -= ((a[pos] - more)*(a[pos] - more + 1)/2);
                ans = max(ans, cnt);
            }
        }
        printf("%lld\n",ans);
    }
 
}
全部评论

相关推荐

后来123321:别着急,我学院本大二,投了1100份,两个面试,其中一个还是我去线下招聘会投的简历,有时候这东西也得看运气
点赞 评论 收藏
分享
吐泡泡的咸鱼:我也工作了几年了,也陆陆续续面试过不少人,就简历来说,第一眼学历不太够,你只能靠你的实习或者论文或者项目经历,然后你没有论文,没有含金量高的比赛和奖项,只能看实习和项目,实习来说,你写的实习经历完全不清楚你想找什么工作?行研?数据分析?且写的太少了,再看项目,这些项目先不说上过大学读过研究生的都知道很水,然后对你想找的岗位有什么帮助呢?项目和实习也完全不匹配啊,你好像在努力将你所有的经历都放在简历里想表现你的优秀,但是对于你想找的岗位来说,有什么用呢?最后只能获得岗位不匹配的评价。所以你需要明白你想要找的岗位要求是什么,是做什么的,比如产品经理,然后再看你的经历里有什么匹配的上这个岗位,或者对这个岗位以及这个岗位所在的公司有价值,再写到你的简历上
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务