Codeforces Round #611 (Div. 3) E题
作者:互联网
每个房子可以住人,输入n个人,每个人可以向左或者向右移动一个位置,求最少占房子的数量和最大占房子的数量。
最小:从有人的开始数三个可以到中间的房子里
最大:从左往右扫,大于一的往右一挪,再从右往左扫,大于一的往左诺,因为是大于一,所以不会有人移动两次
int maxx[MAXN],minn[MAXN];
int main() {
int n,x;
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> x;
maxx[x]++;
minn[x]++;
}
for(int i = 1; i <= n; i++) {
if(maxx[i] > 1) {
maxx[i+1]++;maxx[i]--;
}
}
for(int i = n; i >= 1; i--) {
if(maxx[i] > 1) {
maxx[i-1]++;maxx[i]--;
}
}
int maxi = 0,mini = 0;
for(int i = 0; i <= n+1; i++) {
if(maxx[i] > 0) maxi++;
}
for(int i = 1; i <= n;) {
if(minn[i]) {
mini++;
i+=3;
}
else i++;
}
cout << mini << " " << maxi << endl;
system("pause");
return 0;
}
标签:maxx,minn,int,611,Codeforces,房子,++,maxi,Div 来源: https://www.cnblogs.com/ASLHZXY/p/12116736.html