• 1010STAMPS


    做的过程有个疑问,要不要建一个4倍于原来价格的数组,其中前四个相同等于第一个原来的价格,后来发现这样会导致tie,所有就放弃这种做法,后面用了一个for(j)循环搞定了

    for(i=a+1;i<=n;i++){
    for(int j=1;j<=4;j++){

    验证答案都对了,提交时,提示超时,看了人家的代码,之后发现,自己的代码无论怎么输入都不会结束,所以也借用了人家代码中的一个语句

    if(scanf("%d",&a)==EOF)exit(0);

    我的代码,ACCEPT

    #include "iostream"
    #include "string.h"
    #include "algorithm"
    
    using namespace std;
    int data[1000],bestlei=0,bestliang=0,bestmax=0,flag,x,n,set[1000],list[1000],p[1000],man[1000],y;
    
    int check(){
      int i,tem=0;
      for(i=1;i<=n;i++){
        if(set[i])tem++;
      }
      if(tem>bestlei){bestlei=tem;return 0;}
      else if(tem==bestlei){return 1;}
      else return 2;
    }
    
    void chang(int a){
      int i;
      x=a;
      for(i=1;i<=a;i++){
        list[i]=data[i];
      }
    }
    
    void dfs(int a,int step,int sum){
      int i;
      if(sum>y)return;
      if(step>4)return;
    
      if(sum==y){
        int tem=check();
        if(tem==0){
            chang(step);
            bestliang=step;
            bestmax=p[a];
            flag=0;
        }
        else if(tem==1){
          if(step<bestliang){
            chang(step);
            bestliang=step;
            bestmax=p[a];
            flag=0;
          }
          else if(step==bestliang){
            if(p[a]>bestmax){
              chang(step);
              bestmax=p[a];
              flag=0;
            }
            else if(p[a]==bestmax){flag=1;}
          }
        }
        return;
      }
      for(i=a+1;i<=n;i++){
        for(int j=1;j<=4;j++){
          set[i]=1;
          data[step+j]=p[i];
          dfs(i,step+j,sum+p[i]*j);
          set[i]=0;
        }
      }
    }
    
    int main(){
      int a,i,top,num[1000];
      while(true){
        top=1;
        while(true)
        {
            if(scanf("%d",&a)==EOF)exit(0);
            if(a==0)break;
            p[top++]=a;}
        n=top-1;
        sort(p+1,p+n+1);
        top=1;
    
        while(cin>>a&&a){man[top++]=a;}
        for(i=1;i<top;i++){
            memset(set,0,sizeof(set));
            flag=2;
            y=man[i];
            bestlei=0;bestliang=0;bestmax=0;
            dfs(0,0,0);
            if(flag==1)cout<<man[i]<<" ("<<bestlei<<"):"<<" tie"<<endl;
            else if(flag==0){
              cout<<man[i]<<" ("<<bestlei<<"):";
              for(int j=1;j<=x;j++){
                cout<<' '<<list[j];
              }
              cout<<endl;
            }
            else {
              cout<<man[i]<<" ---- "<<"none"<<endl;
            }
        }
      }
    }
  • 相关阅读:
    python __builtins__ set类 (60)
    python __builtins__ reversed类 (58)
    python __builtins__ range类 (56)
    python __builtins__ property类 (55)
    python __builtins__ memoryview类 (46)
    python __builtins__ map类 (44)
    python __builtins__ list类 (42)
    python __builtins__ license类 (41)
    (转)面试算法总结
    (Mark)JS中的上下文
  • 原文地址:https://www.cnblogs.com/dowson/p/3392583.html
Copyright © 2020-2023  润新知