每日刷题38

资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
  寒假到了,同学们一同坐火车出游。一节列车有N个隔间,一个隔间可以容纳四个人,隔间都住满了,同学们买到的票并不在一起,有的隔间没有同学,有的隔间只有一个同学,有的有两个,有的三个,有的住满了同学。如果一个隔间少于三个同学,那他(们)就会觉得十分孤单。好在可以跟别的乘客商量换座来让同学们住到同一个隔间,但劝说别人换位置是一件比较麻烦的事情,请问最少交换多少次能够让所有有同学的隔间中都有不少于三个同学?
输入格式
  输入的第一行,包含一个正整数N,表示隔间的数量。
  输入的第二行N个0~4的数字,表示每个隔间有多少个同学。
输出格式
  一个整数,表示最少交换次数。如果无论如何交换都无法满足要求,则输出-1。
样例输入
5
1 2 2 4 3
样例输出
2
数据规模和约定
  1<=N<=1000000
解答:后面会超时,而且应该有一些情况没有考虑到这里只是提供一直思路

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll L = 1e6+1;
bool flag=0;
ll n,counts;
ll carriage[L];
int main(){
    
    
    cin >> n;
    for (int i =1;i<=n;i++){
    
    
        ll temp = 0;
        cin >> temp;
        if(temp!=3)
        carriage[i]=temp;
        else{
    
    
        i--;n--;
        }
    }
    for(int i =1;i<=n;i++){
    
    
    // cout<<carriage[i];
        for(int j = i+1;j<=n;j++){
    
    
            if(carriage[i]+carriage[j]==3){
    
    
                carriage[i] = carriage[i]+carriage[j];
                counts++;
                flag=1;
            }
            if(flag){
    
    
                for(int k =j;k<n;k++){
    
    
                    carriage[k] = carriage[k+1];
                }
                n--;
                flag=0;
            }

        }
    }
    for(int i =1;i<=n;i++){
    
    
        for(int j = 1;j<=n;j++){
    
    
            if(carriage[i]==2)
                if(carriage[j]==4){
    
    
                    carriage[i] = 3;
                    carriage[j] = 3;
                    counts++;
                }
        }
    }
    for(int i =1;i<=n;i++){
    
    
        if(carriage[i]<3 && carriage[i]>0){
    
    
        cout<<-1;
        return 0;
        }
    }
 
    cout<<(counts);
    return 0;


}

猜你喜欢

转载自blog.csdn.net/weixin_47988292/article/details/130039537