1358B - Codeforces Round #645 (Div. 2) - Maria Breaks the Self-isolation

地址:https://codeforces.com/problemset/problem/1358/B

题意:

老太太 FREEDOM 打算在新冠期间组织聚会(freedom!!!冥主!!!自由!!!

 

对于第 i 人,如果在她进院子的时候,院子里的人数(不包括自己) >= ai,她就来(嫌死得不够快

求的是最多能有多少人参加聚会

思路:

显然,为了让更多的人能加入聚会,让要求低(院子里的人数 >= ai)先到,充到场人头数字,从而可以邀请更多要求高的,所以,将{a1,a2,a3,...,an}升序排序一下,利用数组的下标计“院子里到的人数”

如:

原: 1 5 4 5 1 9

排序:1 1 4 5 5 9  a[i]

下标:1 2 3 4 5 6  i ===> 院子里的人数

条件:a[i] <= i 

所以:1 1 4 5 5 9

按照上方的逻辑,遇到“4”的时候,看似是无解的,但只要其后面的人可以来,就可以让后面的人与"4"同时到场,从而在“4”到场的时候,院子里的人数必然满足"4"要求,也必然满足后面的人的要求【互相充人头】

由上,5位可以到,加上举办方 FREEDOM,共计6人可以到场 

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N  = 1e5 + 10;
int a[N];
int main(){
    // freopen("x.txt","r",stdin);
    int t;
    cin >>t;
    while(t--){
        int n;
        cin >>n;
        for(int i = 1; i <= n;i++){
            scanf("%d",&a[i]);
        }
        sort(a+ 1,a+n+ 1);
        int ans =  0;
        for(int i = 1;i <= n;i++){
            if(a[i] <= i){
                ans = i;
            }
        }
        cout << ans +  1 <<endl;
    }
    return 0;
}

 

posted @ 2020-11-08 22:33  远征i  阅读(110)  评论(0编辑  收藏  举报