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;
        }
    }
  }
}

 

posted @ 2013-10-28 15:46  龙城星  阅读(132)  评论(0编辑  收藏  举报