USACO Chapter1-Getting started Section 1.3

来源:互联网 发布:windows 开机启动 编辑:程序博客网 时间:2024/05/18 15:56

USACO题目还是不错的。

 

Mixing Milk

一道水贪心,不能再水。

/*ID:kkkwjx1LANG:C++TASK:milk*/#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct Elem{    int cost,amount;};Elem p[5010];bool cmp(Elem a,Elem b){    return a.cost<b.cost;}int main(){    freopen("milk.in","r",stdin);    freopen("milk.out","w",stdout);    int N,M;    scanf("%d%d",&N,&M);    for(int i=0; i<M; ++i)        scanf("%d%d",&p[i].cost,&p[i].amount);    sort(p,p+M,cmp);    int ans=0;    for(int i=0; i<M; ++i)    {        int mn=min(N,p[i].amount);        ans+=mn*p[i].cost;        N-=mn;        if(N==0) break;    }    printf("%d\n",ans);    return 0;}


Barn Repair

我是逆向思考计算的没有覆盖的距离。

/*ID:kkkwjx1LANG:C++TASK:barn1*/#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>using namespace std;int main(){     freopen("barn1.in","r",stdin);     freopen("barn1.out","w",stdout);    int M,C,S;    scanf("%d%d%d",&M,&S,&C);    int a[205]= {0},p[205]= {0};    for(int i=0; i<C; ++i)        scanf("%d",&a[i]);    sort(a,a+C);    if(M>=C)        printf("%d\n",C);    else    {        for(int i=1; i<=C; ++i)            p[i]=a[i]-a[i-1];        sort(p+1,p+1+C);        int q=0;        for(int i=C; C-i<M-1; --i)            q+=p[i];        int ans=a[C-1]-a[0]+M-q;        printf("%d\n",ans);    }    return 0;}


Calf Flac

回文,用简单的搜索做的,还是抄了白书上面的,自己没怎么看,有空还得回来研究下。

另外此题坑爹用了各种文件操作。

/*ID:kkkwjx1LANG:C++TASK:calfflac*/#include <iostream>#include <fstream>#include <cstdio>#include <cstring>#include <string>#include <cctype>#define MAXN 20000 + 10using namespace std;char s[MAXN];int p[MAXN];int main(){    int n,m=0,mx=0,x,y;    ifstream fin("calfflac.in");    ofstream fout("calfflac.out");    char c;    string buf("");    while (!fin.eof ())    {        c = fin.get();        buf += c;    }    n=buf.size();    for(int i=0; i<n; ++i)        if(isalpha(buf[i]))        {            p[m]=i;            s[m++]=toupper(buf[i]);        }    for(int i=0; i<m; ++i)    {        for(int j=0; i-j>=0&&i+j<m; ++j)        {            if(s[i-j]!=s[i+j]) break;            if(j*2+1>mx)            {                mx=j*2+1;                x=p[i-j];                y=p[i+j];            }        }        for(int j=0; i-j>=0&&i+j+1<m; ++j)        {            if(s[i-j]!=s[i+j+1]) break;            if(j*2+2>mx)            {                mx=j*2+2;                x=p[i-j];                y=p[i+j+1];            }        }    }    fout<<mx<<endl;    for(int i=x; i<=y; ++i)        fout<<buf[i];    fout<<endl;    return 0;}


Prime Cryptarithm

一个非常简单的暴力搜索。判断一下长度还有该数字是否可以使用。

/*ID:kkkwjx1LANG:C++TASK:crypt1*/#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <map>#include <string>#define INF 0x7f7f7f7fusing namespace std;bool vis[10];bool Check(int val){    while(val)    {        int tmp=val%10;        if(!vis[tmp]) return false;        val=val/10;    }    return true;}int Get_L(int val){    int l=0;    while(val)    {        l++;        val=val/10;    }    return l;}int main(){     freopen("crypt1.in","r",stdin);     freopen("crypt1.out","w",stdout);    int n;    scanf("%d",&n);    int p[10];    int ans=0;    memset(vis,0,sizeof(vis));    for(int i=0; i<n; ++i)    {        scanf("%d",&p[i]);        vis[p[i]]=true;    }    for(int i=0; i<n; ++i)        for(int ii=0; ii<n; ++ii)            for(int iii=0; iii<n; ++iii)            {                int a=p[i]*100+p[ii]*10+p[iii];                for(int j=0; j<n; ++j)                    for(int jj=0; jj<n; ++jj)                    {                        int b=p[j]*10+p[jj];                        int x=a*p[jj],y=a*p[j],z=a*b;                        if(Get_L(x)!=3) continue;                        if(Get_L(y)!=3) continue;                        if(Get_L(z)!=4) continue;                        if(Check(x)&&Check(y)&&Check(z)) ans++;                    }            }    printf("%d\n",ans);    return 0;}


 

原创粉丝点击