USACO Section 1.3

来源:互联网 发布:大数据人工智能培训 编辑:程序博客网 时间:2024/06/06 04:19

      昨天到今天又做了四道简单的题。有开启了一个新的一页。

milk: 很简单的贪心,先选单价便宜的呀。

代码:

/*ID: duanjia2PROG: milkLANG: C++*/#include<iostream>#include<algorithm>#include<fstream>using namespace std;struct node{       int p,a;} s[5005];bool cmp(node x,node y){     return x.p<y.p;}int main(){    ifstream fin("milk.in");    ofstream fout("milk.out");    int n,m,sum,i;    fin>>n>>m;    for(i=0;i<m;i++) fin>>s[i].p>>s[i].a;    sort(s,s+m,cmp);    sum=0;    for( i=0;i<m;i++){         if(n>=s[i].a)         n-=s[i].a,sum+=s[i].p*s[i].a;         else{              sum+=n*s[i].p;              break;         }    }    fout<<sum<<endl;    //  system("pause");                return 0;} 

Barn1: 讲关牛的一些故事,呵呵。就是说有50个牛栏,其中有的有牛,有的没,牛栏的门坏了,现在你有m块木板,要你遮住所有的有牛的牛栏,木板可以是任意长,每个牛栏相当于需要一个单位的木板,问你至少需要多少木板。先假设把50个都遮住了,再来截m-1个最大的空隙。

代码:

/*ID: duanjia2PROG: barn1LANG: C++*/#include<iostream>#include<algorithm>#include<fstream>using namespace std;bool cmp(int a,int b){     return a>b;}int main(){    ifstream fin("barn1.in");    ofstream fout("barn1.out");    int m,s,c,i,j,ans;    int b[205],d[200];    fin>>m>>s>>c;    for(i=0;i<c;i++)      fin>>b[i];       if( m>=c)        fout<<c<<endl;    else{         sort(b,b+c);            for( i=1,j=0;i<c;i++)              if( b[i]-b[i-1]>1)                  d[j++]=b[i]-b[i-1]-1;         sort(d,d+j,cmp);         ans=b[0]-1+50-b[c-1];             for( i=0;i<m-1;i++)                       ans+=d[i];               fout<<50-ans<<endl;    }    //system("pause");                    return 0;}

calfflac: 最长回文。建议去网上查一下manacher算法,我以前做过,所以本题也是这样做的。

代码:

/*ID: duanjia2PROG: calfflacLANG: C++*/#include<iostream>#include<stdio.h>#include<string.h>#include<fstream>using namespace std;int main(){    ifstream fin("calfflac.in");    ofstream fout("calfflac.out");    int i,id,mx,len,pt[20005],j,r[20005];    char str[200005],s[20005],m[50005],ch;        memset(pt,0,sizeof(pt));    for( i=0,j=0;str[i]=fin.get(),str[i]>0;i++){         if( str[i]>='a'&&str[i]<='z')             s[j]=str[i],pt[j++]=i;         if( str[i]>='A'&&str[i]<='Z')             s[j]=str[i]-('A'-'a'),pt[j++]=i;    }     s[j]='\0'; len=j;  //  cout<<len<<endl;    m[0]='@';    for( j=1,i=0;i<len;i++){         m[j++]='#';         m[j++]=s[i];    }         m[j++]='#', m[j]='\0';    len=j;        //manacher算法。    memset(r,0,sizeof(r));    mx=0,id=0;    for( i=1;i<len;i++){                  if(i<mx)  r[i]=min(r[2*id-i],mx-i) ;         else r[i]=1;                   while(m[i+r[i]]==m[i-r[i]]) r[i]++;                  if( r[i]+i>mx){             mx=r[i]+i;             id=i;         }    }    mx=0;    for( i=1;i<len;i++)         if(mx<r[i])         mx=r[i],id=i;    len=pt[(id+r[id]-3)/2];    fout<<mx-1<<endl;     for(  j=pt[(id-r[id])/2];j<=len;j++)         fout<<str[j];    fout<<endl;                                                 // system("pause");    return 0;}

crypt1: 枚举的说,看不出哪里贪心了。得看看别人怎么做了。

代码:

/*ID: duanjia2PROG: crypt1LANG: C++*/#include<iostream>#include<algorithm>#include<string.h>#include<fstream>using namespace std;int f[10];bool Judge(int n){     while( n){            if(!f[n%10]) return false;            n/=10;     }     return true;  }int main(){    ifstream fin("crypt1.in");    ofstream fout("crypt1.out");    int i,j,n,cnt;    fin>>n;    memset(f,0,sizeof(f));    for( i=0;i<n;i++){         fin>>j;         f[j]=1;    }                cnt=0;    for( i=111;i<=999;i++){     if( Judge(i)){      for( j=11;j<=99;j++)       if( Judge(j) && i*j<10000 && (j%10)*i<1000 && (j/10)*i<1000 && Judge( i*(j%10) ) && Judge(i*(j/10) ) && Judge(i*j) )        cnt++;      }    }    fout<<cnt<<endl;   // system("pause");                      return 0;}


原创粉丝点击