zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    计算机英语
    NSQ学习记录
    Java学习记录-注解
    VS插件开发

    双链表
    顺序表
    顺序队列
    顺序栈

  • 原文地址:https://www.cnblogs.com/ASLHZXY/p/12116736.html
Copyright © 2011-2022 走看看