求调 REp8836
  • 板块学术版
  • 楼主Earlyzzy
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/22 17:24
  • 上次更新2024/10/22 19:48:36
查看原帖
求调 REp8836
1270268
Earlyzzy楼主2024/10/22 17:24
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;

int n,m;
int num[4];
vector<vector<int>> hun;

vector<int> minn(vector<int> &A,int id)//返回A中最小的数
{
    vector<int>C;
    //  for(auto a:A)
    //  cout<<a<<endl;
    
     //cout<<A[1]<<endl;
    for(int j=1;j<=n;j++)//每种扑克牌张数
    for(int i=1;i<=m;i++)//扑克牌种类
        if(A[i]>=j)
        {
            A[i]-=j;
            int t=j;
            while(t--)
            C.push_back(i);
            num[id]-=j;
          //  cout<<i<<endl;
            return C;
        }
    return C;
}

vector<int> mnn(vector<int>&A,vector<int> &B,int id)//求一个大于A的数,若没有则返回一个长度为0 的vector。
{
    vector<int>C;
    int cnt=A.size(),n=A.front();
 
    for(int i=1+n;i<=m;i++)
       if(B[i]>=cnt)
    {
      C.insert(C.end(),cnt,i);
      B[i]-=cnt;
      num[id]-=cnt;
      return C;
    }
  
   for(int i=1;i<=n;i++)
       if(B[i]>cnt)
       {
           B[i]-=(cnt+1);
           C.insert(C.end(),cnt+1,i);
           num[id]-=(cnt+1);
           return C;
       }
    return C;
}

int main()
{
    
    cin>>n>>m;
    hun.resize(4,vector<int>(m+2,0));
    for(int i=0;i<3;i++)num[i]=n;
    
    for(int i=0;i<3;i++)
        for(int j=0;j<n;j++)
        {
            int x;
            cin>>x;
            hun[i][x]++;
        }
    //       for(int j=0;j<3;j++)
    // {        for(int k=1;k<=3;k++)
    //         cout<<hun[j][k]<<" ";
    //         cout<<endl;
    // }
    
     auto last=minn(hun[0],0);
        int choice=0;
        int cnt=0;
    
    for(int i=1;;i++)
    {
    //  for(auto l:last)
    // cout<<l<<" ";
    // cout<<endl;
        int id=i%3;
        
      if(choice==2)
      {
          choice=0;
      last=minn(hun[id],id);
      continue;
      }
    //  cout<<choice<<endl;
    
        //cout<<choice<<endl;
        auto A=mnn(last,hun[id],id);
        if(A.size()==0)
        {
            choice++;
         //   cout<<id+1<<"出不起"<<endl;
        }
        if(A.size()){
            last=A;
       // cout<<id+1<<"出的起"<<endl;
            choice=0;
        }
    //       for(int j=0;j<3;j++)
    // {        for(int k=1;k<=3;k++)
    //         cout<<hun[j][k]<<" ";
    //         cout<<endl;
    // }
         if(num[id]==0)
        {
            cout<<id+1<<endl;
            break;
        }
       
     }
    return 0;
}
2024/10/22 17:24
加载中...