传送门:牛客

题目描述

Farmer John’s nemesis, Farmer Nhoj, has NNN cows (1≤N≤1051 \leq N \leq 10^51≤N≤105), conveniently numbered 1…N1 \dots N1…N. They have unexpectedly turned up at Farmer John’s farm, so the unfailingly polite Farmer John is attempting to give them gifts.
To this end, Farmer John has brought out his infinite supply of gifts, and Nhoj’s cows have queued up in front of him, with cow 111 at the head of the queue and cow NNN at the tail. Farmer John was expecting that at every timestep, the cow at the head of the queue would take a gift from Farmer John and go to the tail of the queue. However, he has just realized that Nhoj’s cows are not that polite! After receiving her gift, each cow may not go to the tail of the queue, but rather may cut some number of cows at the tail, and insert herself in front of them. Specifically, cow iii will always cut exactly cic_ici​ cows (0≤ci≤N−10 \leq c_i \leq N-10≤ci​≤N−1).
Farmer John knows that some cows might receive multiple gifts; as he has an infinite supply, this does not worry him. But he is worried that some cows might become unhappy if they do not get any gifts.
Help Farmer John find the number of cows who never receive any gifts, no matter how many gifts are handed out.

输入格式

The first line contains a single integer, NNN.
The second line contains NNN space-separated integers c1,c2,…,cNc_1, c_2, \dots, c_Nc1​,c2​,…,cN​.

输出格式

Please output the number of cows who cannot receive any gifts.

样例 #1

样例输入 #1

3
1 2 0

样例输出 #1

1

牛客网上的4星题,洛谷上曾经的紫题(现在也还是蓝题),可以说有一定的难度的,思考起来也比较费劲(虽然这道题的题面看起来并不复杂),大概花了我一个早上加中午的时间才完整的做出了这道题

主要思路;

  1. 首先看完题目我们能够发现有以下一个现象,首先是他的转换操作是无限的(注意这一点,并不是一次的,而是可以一直的重复换牛的操作的),所以假设如果我们的标号为K的牛(下列简称为牛K)最终分不到自己的礼物的话,说明牛K之前的牛自己形成了一个循环,也就是永远都在牛K之前自己在反复领礼物,举个栗子,就如1,2,0这个栗子,操作一次形成2,1,0,在操作一次1,2,0发现又形成了之前的数列,永远都到不了牛0,也就是自己形成一个循环
  2. 我们考虑思路一中的现象,然后思考一下,什么时候牛K之前的牛会自己形成一个循环呢,当然是牛K之前的数字无论怎样都到不了牛K之后的时候才会形成啦,换句话说,假设牛K之前的牛有机会都到达牛K之后的话,就说明牛K是能到达第一个的(也就是牛K之前并没有形成循环,也就是说牛K之前包括牛K都是可以领到礼物的),根据这个现象,我们就直接进行二分答案来找到最佳的牛K的位置(check函数我们在接下来会详细讲解)
  3. 在思路二中我们发现可以用二分来解决这个问题,但是此时摆在我们面前的还有一个check函数,我们究竟该怎么办才能判断牛K之前的牛有没有构成一个循环了,在思路二中我们也提到了,如果牛K之前有一条牛无法到达牛K之后的话,就说明形成了一个循环,这时候肯定就有人会想了,这不是很简单吗,我直接循环一下不就解决了,但是注意,此时的移动并不是一次性的,题目中告诉了我们可以进行无数次的操作,所以并不能以上述那个朴素的想法去考虑这个问题

对于这个问题呢,我们试着将牛K之前的牛的Ci值进行排序操作,将其以(换之后插入的位置从大往小进行),为什么这么操作呢,这就是我们这篇题解中的重点了,因为我观看了各大的题解(包括洛谷和牛客),皆没有对这一步进行详细的解释,而我认为这一步恰恰是我们这道题的关键所在

我们试着想一下,因为我们的循环操作是无限次的,这说明了什么呢,说明我们无论有没有进行排序,即使我们是按照顺序进行操作的,也就是没有排序,但是依然是Ci值较大的先会到达牛K的后面,注意我们的操作是无限次的,也就是即使有一个牛之前第一次的操作没有到牛K之后,后来也依旧是有机会到牛K之后的,但是这就是在Ci值较大的之后在进行的事情了,也就是说此时我们考虑的是有哪些牛会达到牛K的后面,但是这个跟我们牛K之前的牛本来的排序其实是没有关系的,因为能出去的肯定会出去,无论早晚,不能出去的肯定是出不去的,如果还不能理解的话,可以试着结合下面我的证明来理解

对于一个数列,假设目前第一位为U,此时对于U有两种情况:A(U)>=k,此时U直接可以放到K之后假设此时的U是最大值,
那么这个和最大值先出去没有矛盾,假设它不是最大值,那么排在第一位的U都能出去,在U之后还比他大的数字肯定能
出去,与之前不矛盾
假设A(U)<=k,假设此时的U是最大值,那么之后的数字肯定是<=A(U)的,如果是等于的话之前无矛盾,如果是小于的话,那么至少也是减一,这个时候的话肯定还是出不去的,因为位置也相对减一了,所以形成了循环,也就是最大值出不去,就
形成循环,与之前不矛盾
假设此时的U不是最大值,那么此刻的U将会被换到后面等待下一次轮换,对于这种情况,我们的U进行换位置之后就会再
一次的重复我们上述的四种情况,假设有一次前三种,我们就不矛盾,假设一直都是第四种,那这是不可能的,因为迟早有
一次会换到最大的一个数,不然就是循环了,假设我们碰到了循环的情况的话(并且在循环形成之前最大值也没有碰到),那么我们最大值能不
能出去都对我们的判断没有造成影响,因为出去了,无伤大雅,因为本来也轮不到最大值,相当于减掉,如果没有出去,因为
本来我们就是循环的,所以也没有关系,直接判断为循环即可

下面是具体代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <stack>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define root 1,n,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {ll x=0,w=1;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x*w;
}
#define maxn 1000000
int n,c[maxn];
bool cmp(int a,int b) {return a>b;
}
int fuzhu[maxn];
int check(int mid) {if(mid==1) return true;for(int i=0;i<mid;i++) fuzhu[i]=c[i];sort(fuzhu,fuzhu+mid,cmp);int kk=mid;for(int i=0;i<mid-1;i++) {if(fuzhu[i]<kk) {return false;}kk--;}              return true;
}
int main() {n=read();c[0]=-1;for(int i=1;i<=n;i++) {c[i]=read();c[i]=n-c[i];} int l=0,r=n-1;int ans;while(l<=r) {int mid=(l+r)>>1;if(check(mid)) {ans=mid;l=mid+1;  }else {r=mid-1;}}cout<<n-ans<<endl;return 0;
}

刷题记录:牛客NC24083Greedy Gift Takers相关推荐

  1. 刷题记录:牛客NC24608[USACO 2011 Ope S]Learning Languages

    传送门:牛客 题目描述: [USACO11OPEN]Learning Languages S 农夫约翰的 N ( 2 < = N < = 10 , 000 ) N(2<=N<= ...

  2. 刷题记录:牛客NC16129小小粉刷匠

    传送门:牛客 题目描述: "lalala,我是一个快乐的粉刷匠",小名一边快活地唱着歌,一边开心地刷着墙",兴致突然被打断,"小名,你今天如果刷不 完这一栋楼的 ...

  3. 刷题记录:牛客NC17889新建 Microsoft Office Word 文档

    传送门:牛客 题目描述: CSL正在学习<计算机办公自动化>文件的建立与删除. CSL发现,当他新建一个word文档时,会得到一个名为"新建 Microsoft Office W ...

  4. 刷题记录:牛客NC17193简单瞎搞题

    传送门;牛客 题目描述: 一共有 n个数,第 i 个数是 xi xi 可以取 [ l i , r i ] [li , ri] [li,ri] 中任意的一个值. 设 S = ∑ x i 2 S = \s ...

  5. 刷题记录:牛客NC16122郊区春游

    传送门:牛客 题目描述: 今天春天铁子的班上组织了一场春游,在铁子的城市里有n个郊区和m条无向道路,第i条道路连接郊区Ai和Bi, 路费是Ci.经过铁子和顺溜的提议,他们决定去其中的R个郊区玩耍(不考 ...

  6. 刷题记录:牛客NC20811蓝魔法师

    传送门:牛客 题目描述: "你,你认错人了.我真的,真的不是食人魔."--蓝魔法师 给出一棵树,求有多少种删边方案,使得删后的图每个连通块大小小于等于k,两种方案不 同当且仅当存在 ...

  7. 刷题记录:牛客NC20875舔狗舔到最后一无所有

    传送门:牛客 题目描述: 作为队伍的核心,forever97很受另外两个队友的尊敬. Trote_w每天都要请forever97吃外卖,但很不幸的是宇宙中心forever97所在的学校周围只有3家fo ...

  8. 刷题记录:牛客NC15162小H的询问

    传送门:牛客 题目描述: 小H给你一个数组{a},要求支持以下两种操作: 1. 0 l r(1<=l<=r<=n),询问区间[l,r]中权值和最大的有效子区间的权值和,一个子区间被认 ...

  9. 刷题记录:牛客NC15447wyh的问题

    传送门:牛客 题目描述: 我国现在能源消耗非常严重,现在政府有这样一个工作,每天早上都需要把一些路灯关掉,但是他们想 让在关闭的过程中所消耗的能源是最少的,负责路灯关闭的工作人员以1m/s的速度进行行 ...

最新文章

  1. 使用sigaction处理内核信号
  2. 数组子数组求最大值1
  3. linux定时任务crontab 时间,shell后台定时任务时crontab的用法
  4. 理解并实施:GLBP(ccna200-120新增考点)
  5. 关于ElasticSearch整合SpringBoot
  6. 1000行MySQL学习笔记,人手一份,建议收藏!
  7. python判断序列值横穿整个区间的次数
  8. 机器学习:神经网络之表达
  9. 什么是SWFObject?
  10. 喜马拉雅FM下载的音频文件保存在哪_怎么导出来
  11. android ios开发难度对比,ios VS android:这不就是简洁与复杂最明显的对比
  12. 狂神说Swagger笔记
  13. APP测试面试题,总结的很到位,安排!
  14. php在线编辑gif图片,gif动态图片制作,在线制作 GIF动画工具
  15. java代码实现十进制到二进制的转化
  16. 教你自制一款简单的助听器
  17. 微信小程序checkbox调整大小
  18. 项目:基于yolov5的舰船检测+pycharm+机器学习+图像检测
  19. 页面布局的几种宽度设置方式—html
  20. 11篇推荐系统入门必读经典论文(附下载链接)

热门文章

  1. xzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  2. 西游记中孙悟空有哪些技能?
  3. everything changes so quietly
  4. 各代iPhone iPad 内部代号 Hardware Model
  5. B2C电商模式的现状是怎样的?有什么优劣势?
  6. 2021年哪些办公软件比较好用?
  7. 计算机网络总结(1)
  8. 监督学习最常见的四种算法
  9. latex插入参考文献小技巧
  10. minio文件加密/文件切割合并