<题目链接>
题目大意:
一家公司想让n个人给他们的产品评论,所以依次去找这n个人,第i个人会评论当且仅当已经有ai个人评论或他确实对这个产品感兴趣,但是这n个人都不对这个产品感兴趣,问这个公司至少要说服几个人对该产品该兴趣才能至少收到m个人的评论。
解题分析:
直接二分答案,然后按顺序进行判断,如果ai大于当前评论的人就说服该人,这里用到了贪心的思想(本题的关键),因为说服该人能够提供评论数的贡献,所以越早做贡献能够带来更多的贡献,然后根据评论的人数与m的比较来控制二分答案的方向。
1 #include <cstdio> 2 using namespace std; 3 4 const int M =2e5+10; 5 int n,m; 6 int arr[M]; 7 bool check(int x){ 8 int res=0; //res代表当前的评论数 9 for(int i=1;i<=n;i++){ 10 if(arr[i]<=res)res++; 11 else if(arr[i]>res&&x>0){ //劝说该人 12 x-=1; 13 res++; 14 } 15 } 16 return res>=m; 17 } 18 int main(){ 19 scanf("%d%d",&n,&m); 20 for(int i=1;i<=n;i++){ 21 scanf("%d",&arr[i]); 22 } 23 int l=0,r=n; 24 int ans=0; 25 while(l<=r){ //直接二分答案,枚举需要劝说的人的数量 26 int mid=(l+r)>>1; 27 if(check(mid))ans=mid,r=mid-1; 28 else l=mid+1; 29 } 30 printf("%d ",ans); 31 return 0; 32 }
2018-11-04