Codeforces Round #611 (Div. 3)E. New Year Parties
https://codeforces.com/contest/1283/problem/E
题意:n个人位于1-n坐标上,每一个人可以向左或向右移动一步或不移动。坐标范围为0-n+1.
问这些人最少可以占领多少个坐标,最多可以占领多少个坐标。
解法:最少:i , i+1 , i+2 .坐标上的人可以聚集到i+1上来。
最多:将大于1个人的坐标上的人向两边分散开来。
const int maxn = 2e5+9; int vis[maxn]; void solve(){ int n ; cin >> n ; rep(i , 1 , n){ int x ; cin >> x; vis[a[i]]++; } int mi = 0 , ma = 0; for(int i = 1 ; i <= n ;){//周围向一个位置靠拢 if(vis[i]){ i += 3 , mi++; }else{ i++; } } rep(i , 0 , n){ if(vis[i] > 1) vis[i]-- , vis[i+1]++;//向右边散开 } red(i , n+1 , 1){ if(vis[i] > 1) vis[i]-- , vis[i-1]++;//向左边散开 } rep(i , 0 , n+1){ ma += vis[i] == 0 ? 0 : 1 ; } cout << mi << " " << ma << endl; }