4558208_ac_172ms_272k.cpp

来自「部分PKU上的源码」· C++ 代码 · 共 121 行

CPP
121
字号
#include<iostream>
using namespace std;
int m[100],un[100],bestun[100],total,best[5],typen,bestnum,bestmax,tie,maxnum;
void copyun()
{
  int i,j=1;
  for(i=1;i<=m[0];i++)
  if(un[i]!=0){bestun[i]=un[i];}
}
int comparison()
{
  int i,j=0,k=0,max=0;
  for(i=1;i<=m[0];i++)
  if(un[i]!=0){k++;j=j+un[i];}
  for(i=1;i<=m[0];i++)if(un[i]!=0&&m[i]>max)max=m[i];
  if(k>typen){typen=k;bestmax=max;bestnum=j;tie=0;copyun();return 1;} 
  else if(k==typen)
    {   
      if(j<bestnum){bestnum=j;bestmax=max;tie=0;copyun();return 1;}
      else if(j==bestnum)
      {
          if(max>bestmax){bestmax=max;tie=0;copyun();return 1;}
          else if(max==bestmax)
          {
              tie=0;
              for(i=1;i<=m[0];i++)
              { 
                  if(un[i]!=bestun[i])tie=1; 
              }    
              return 0;
          }
      }
    }    
  return 0;
}
void copynum()
{
  int i,j,k=0;
  for(i=0;i<5;i++)best[i]=0;
  for(i=1;i<=m[0];i++)
  {
    if (un[i]!=0)
    for(j=0;j<un[i];j++)
    {best[k]=m[i];k++;}
  }  
}
void output()
{
  int i,k=0;
  while(best[k]!=0)k++;
  cout<<" ("<<typen<<"):";
  if(tie==0)
  {
    for(i=0;i<k;i++)cout<<' '<<best[i];
    cout<<endl;
  }
  else if(tie==1)cout<<" tie"<<endl;     
}
void stamp(int n,int current)
{
  int i,j; 
  for(i=current;i<=m[0];i++)
  {
    if(n-m[i]>0&&total<4)
    {current=i;n=n-m[i];total++;un[i]++;stamp(n,current);n=n+m[i];un[i]--;total--;}
    if(n-m[i]==0&&total<4)
    {
      un[i]++;total++;
        if(comparison())
        copynum();
      total--;un[i]--; 
    }      
  }     
}
int judge(int b)
{
    if(b<=4*maxnum)return 1;
    else cout<<" ---- none"<<endl;
    return 0;
}
void countmax()
{
  int i;
  for(i=1;i<=m[0];i++)
  if (m[i]>maxnum)maxnum=m[i];
}
void initnum()
{
    int i;
    for(i=1;i<=m[0];i++){un[i]=0;bestun[i]=0;}
    total=0;typen=0;bestnum=0;tie=0;bestmax=0,maxnum=0;
}
int main()
{
  int a,b;
  char s[100];  
  while(cin>>a)
  {
    m[0]=0;m[1]=a;
    while(a!=0){m[0]++;m[m[0]]=a;cin>>a;}
    cin>>b;
    while(b!=0)
    {
      cout<<b;
      initnum();
      countmax();
      if(judge(b))
      {
          stamp(b,1);  
          if (typen!=0)output();
          else cout<<" ---- none"<<endl;
      }    
      cin>>b;
    }      
  }    
  return 0;
}   



⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?