GYM 101755 K.Video Reviews 【贪心】+【二分】

<题目链接>

题目大意:

一家公司想让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\n",ans);
31     return 0;
32 }

2018-11-04

猜你喜欢

转载自www.cnblogs.com/00isok/p/9905960.html