首页 > 其他分享 >[USACO17DEC] Greedy Gift Takers

[USACO17DEC] Greedy Gift Takers

时间:2024-01-30 14:11:06浏览次数:33  
标签:cnt return 头牛 Gift int USACO17DEC Takers now check

原题链接

首先这道题的数据量1e5那么时间复杂度要保持在O(nlogn)内。

先判断单调性,若k头牛拿不到礼物,那么k-1头牛也拿不到礼物,所有这题可以用二分法来做(11110000)。

二分部分省略,我们直接来分析check部分(如下)。

bool check(int k){
    for (int i=1;i<=n-k+1;i++) b[i]=a[i];
    sort(b+1,b+n-k+1);
    int cnt=k-1;
    for (int i=1;i<=n-k;i++){
        if (b[i]>cnt) return true;
        cnt++;
    }
    return false;
}

我们判断k头牛拿不到礼物,只需要判断倒数第k头(即n-k+1头)牛拿不拿的到礼物,设这头牛为牛now。

牛now不能拿到礼物,说明它永远也挤不到第一的位置。

那么我们反向思考如果牛now能挤到第一的位置则返回false。

此时牛now及前面所有的牛都会到达第一并重新归队,所以在我们的假设中每头牛不论顺序如何都会到达牛now后方。接下来我们用贪心,优先让新位置靠后的牛先入队,尽量把牛now往前挤。

每有一头牛到达牛now后方那么让牛now位置保持不动的ci对应最小值cnt++;而如果此时ci>cnt,那么牛now就不可能再前进到达第一位了,因为排序之后的牛的新位置只可能在更前面。此时返回true。

主要代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N],n,b[N];
bool check(int k){
    for (int i=1;i<=n-k+1;i++) b[i]=a[i];
    sort(b+1,b+n-k+1);
    int cnt=k-1;
    for (int i=1;i<=n-k;i++){
        if (b[i]>cnt) return true;
        cnt++;
    }
    return false;
}
int main(){
    cin>>n;
    for (int i=1;i<=n;i++) cin>>a[i];
    int left=0,right=n;
    while (left+1<right){
        int mid=left+(right-left>>1);
        if (check(mid)) left=mid;
        else right=mid;
    }
    printf("%d\n",left);
    return 0;
}

 

标签:cnt,return,头牛,Gift,int,USACO17DEC,Takers,now,check
From: https://www.cnblogs.com/purple123/p/17996972

相关文章

  • 初中英语优秀范文100篇-024The Best Gift I've Ever Received -我收到的最好的礼物
    PDF格式公众号回复关键字:SHCZFW024记忆树1AmongallthegiftsIhavereceived,thehand-madescarffromJudyisthebestgiftI'veeverreceived.翻译在我收到的所有礼物中,Judy亲手制作的围巾是我收到的最好的礼物简化记忆围巾句子结构这个句子是一个简单句......
  • As a project I always want to create for myself as a gift, the MVVM framework is
    IusedtowanttobuildaMVVMprojectformyself,especiallysinceIwrotemymementowriterprojectwhichisnojQuery,andthatwasverytimeconsumingandtiringtocreate.Lastyear,Ihadsomeinspiration,andreallywantedtotrytostartfreshthin......
  • QOJ # 5573. Holiday Regifting
    题面传送门感觉有点奇妙。首先一个基础的想法就是一个一个往下推,维护每个数往下推的次数,统计当前数在前面的所有数一次归零后会加几次,然后计算这个数需要前面几轮归零,这样将这些系数乘起来就是需要归零的次数了。但是现在有一个问题就是前面每个数往下推的次数可能很大,这东西存......
  • B. Buying gifts[贪心]
    Problem-1801B-Codeforces题意是需要给两个人买礼物,有n个商店,每个商店只能给一个人买,而且每个商店给两个人买的礼物的价钱也可能不同,问给两人买的礼物的最大价格之差最小是多少。我们考虑这种情况。如果当前给b买的礼物最大值为x,那么那些商店里给b礼物价格小于等于x的我们......
  • CF506E Mr. Kitayuta's Gift 思考--zhengjun
    妙妙题。首先可以有一个\(O(kn^2)\)的dp,但是显然不行。但是,发现其中的大多数转移都浪费在自环上了,所以考虑不要这个东西。这个dp一共有三种转移:左右端点一起向内移动一格;左端点或右端点单独移动;左右端点都不动。所以考虑加一维\(k\)表示走了\(k\)次转移1......
  • CF506E Mr. Kitayuta's Gift
    太神了,感觉比任何一道我做过的*3000都难啊!首先考虑一个很蠢的dp,大概设\(f_{k,i,j}\)表示从前往后定了字符串的前\(k\)位,同时也定了后\(k\)位,在原串上从前往后匹配到\(i\),从后往前匹配到\(j\)的方案数,直接硬上矩乘是\(O(|s|^6\logn)\)的。/fad肯定要找一点性质优......
  • HackVM:Gift
    上次编辑时间:April18,20233:07PM创建时间:April18,20232:53PM所有者:twsec标签:靶机渗透靶机地址主机发现80端口访问web端无发现22端口爆破成功直接登录获取flag......
  • Go编写一个小网站--复制粘贴--GiftsForYou
    修修改改成为自己想要的七米老师的:https://github.com/Q1mi/bubblegifts_for_you就是送的礼物的记录字段包括时间、礼物、文字先运行起来1、创建数据库配置连接数据的用户密码CREATEDATABASEbubbleDEFAULTCHARSET=utf8mb4;conf/config.iniport=9000release=......
  • D. Buying gifts
    D.BuyinggiftsLittleSashahastwofriends,whomhewantstopleasewithgiftsontheEighthofMarch.Todothis,hewenttothelargestshoppingcenterin......
  • 爱奇迹 Heaven Gifts-电子雾化行业领军品牌
    深圳市爱奇迹科技有限公司(简称​​爱奇迹​​,HeavenGifts)成立于2007年,是一家集设计、制造、销售营运于一体的电子雾化生产企业。爱奇迹坚持践行“以科技的力量为人类健康社......