USACO Chapter1-Getting started Section 1.2

来源:互联网 发布:json被截断 编辑:程序博客网 时间:2024/06/06 14:13

第二节没有什么难想的题,关于进制转换这块我不是很熟练(其实X进制跟10进制都一样),得补习一下。

Milking Cows (milk2)

区间问题,看数据用int似乎也应该能过。注意一点区间左右都是闭的,也就是说a在t时刻结束,b在t时刻开始,那么a和b属于连续的情况。

/*ID:kkkwjx1LANG:C++TASK:milk2*/#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#define Max(a,b) (a>b)?a:busing namespace std;struct Elem{    int l,r;};bool cmp(Elem a,Elem b){    if(a.l==b.l) return a.r<b.r;    return a.l<b.l;}Elem p[5005];int main(){     freopen("milk2.in","r",stdin);     freopen("milk2.out","w",stdout);    int n;    scanf("%d",&n);    for(int i=0; i<n; ++i)        scanf("%d%d",&p[i].l,&p[i].r);    sort(p,p+n,cmp);    int st=p[0].l,ed=p[0].r;    long long ans1=ed-st,ans2=0;    for(int i=1; i<n; ++i)    {        if(ed<p[i].l)        {            ans2=Max(ans2,p[i].l-ed);            st=p[i].l;            ed=p[i].r;        }        else        {            if(ed<=p[i].r)                ed=p[i].r;        }        ans1=Max(ans1,ed-st);    }    printf("%lld %lld\n",ans1,ans2);    return 0;}


Transformations (transform)

注意一点,1,2,3……这几种操作分别是有优先级的。

例如

2

@@

@@

@@

@@

这种情况应该输出1,而不是6.

/*ID:kkkwjx1LANG:C++TASK:transform*/#include <iostream>#include <cstdio>#include <cstring>#include <string>#define INF 0x7f7f7f7fusing namespace std;int N;char str[12][12],str0[12][12];char str1[12][12],str2[12][12],str3[12][12],str4[12][12];bool ok=false;bool Check(char s[12][12],char ss[12][12]){    for(int i=0; i<N; ++i)        if(strcmp(s[i],ss[i]))            return false;    return ok=true;}void Change90(char s[12][12],char t[12][12]){    for(int i=0; i<N; ++i)        for(int j=0; j<N; ++j)            t[j][N-1-i]=s[i][j];}void Reverse(char s[12][12],char t[12][12]){    for(int i=0; i<N; ++i)        for(int j=0; j<N; ++j)            t[i][j]=s[i][N-1-j];}int main(){     freopen("transform.in","r",stdin);     freopen("transform.out","w",stdout);    scanf("%d",&N);    for(int i=0; i<N; ++i) scanf("%s",str[i]);    for(int i=0; i<N; ++i) scanf("%s",str0[i]);    Change90(str,str1);    if(Check(str1,str0))        putchar('1');    else    {        Change90(str1,str2);        if(Check(str2,str0))            putchar('2');        else        {            Change90(str2,str3);            if(Check(str3,str0))                putchar('3');        }    }    if(!ok)    {        Reverse(str,str4);        if(Check(str4,str0))            putchar('4');        else        {            Change90(str4,str1);            if(Check(str1,str0))                putchar('5');            else            {                Change90(str1,str2);                if(Check(str2,str0))                    putchar('5');                else                {                    Change90(str2,str3);                    if(Check(str3,str0))                        putchar('5');                }            }        }    }    if(!ok)    {        if(Check(str,str0))putchar('6');        else  putchar('7');    }    putchar('\n');    return 0;}


Name That Number (namenum)

将字典中的每个名字转换成数字串。然后寻找与给定数字串相同的输出名字即可。

这里注意题目要输入长度至多12的数字,这意味着int是不够的,long long 应该可以,不过我还是使用了string。

/*ID:kkkwjx1LANG:C++TASK:namenum*/#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <fstream>using namespace std;struct Name{    char str[15];    string num;};char GetNum(char c){    if(c=='A'||c=='B'||c=='C')        return '2';    if(c=='D'||c=='E'||c=='F')        return '3';    if(c=='G'||c=='H'||c=='I')        return '4';    if(c=='J'||c=='K'||c=='L')        return '5';    if(c=='M'||c=='N'||c=='O')        return '6';    if(c=='P'||c=='R'||c=='S')        return '7';    if(c=='T'||c=='U'||c=='V')        return '8';    if(c=='W'||c=='X'||c=='Y')        return '9';}int main(){    freopen("namenum.in","r",stdin);    freopen("namenum.out","w",stdout);    ifstream fin;    char buff[5000][15];    Name p[5000];    int k=0;    fin.open ("dict.txt", ifstream::in);    while (fin.good())    {        fin.getline(p[k].str,200);        int l=strlen(p[k].str);        for(int i=0; i<l; ++i)            p[k].num+=(GetNum(p[k].str[i]));        k++;    };    fin.close();    string tp;    cin>>tp;    bool ok=false;    for(int i=0; i<k; ++i)        if(tp==p[i].num)        {            cout<<p[i].str<<endl;            ok=true;        }    if(!ok) cout<<"NONE"<<endl;    return 0;}


Palindromic Squares (palsquare)

进制转换问题。思路很简单,先将从十进制1开始循环,平方之后转换成B进制,看是否是回文,如果是则将原数转换成B进制并输出还有回文。

/*ID:kkkwjx1LANG:C++TASK:palsquare*/#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>using namespace std;int B;bool Judge(char str[20]){    int l=strlen(str);    for(int i=0; i<=l/2; ++i)        if(str[i]!=str[l-1-i])            return false;    return true;}void Strrev(char str[20]){    int l=strlen(str);    for(int i=0; i<l/2; ++i)        swap(str[i],str[l-1-i]);}void Convers(int val, char str[20],int R){    int i=0;    while(val)    {        int x=val%R;        if(x<10)            str[i++]=x+'0';        else            str[i++]='A'+(x-10);        val=val/R;    }    str[i]=0;    Strrev(str);}int main(){    freopen("palsquare.in","r",stdin);    freopen("palsquare.out","w",stdout);    scanf("%d",&B);    for(int i=1; i<=300; ++i)    {        char s[20]= {0};        Convers(i*i,s,B);        if(Judge(s))        {            char t[20]= {0};            Convers(i,t,B);            printf("%s %s\n",t,s);        }    }    return 0;}


Dual Palindromes (dualpal)

过了上个题这个就容易多了。枚举一下就行了。

/*ID:kkkwjx1LANG:C++TASK:dualpal*/#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>#define LN 30using namespace std;bool Judge(char str[LN]){    int l=strlen(str);    for(int i=0; i<=l/2; ++i)        if(str[i]!=str[l-1-i])            return false;    return true;}void Strrev(char str[LN]){    int l=strlen(str);    for(int i=0; i<l/2; ++i)        swap(str[i],str[l-1-i]);}void Convers(int val, char str[LN],int R){    int i=0;    while(val)    {        int x=val%R;        if(x<10)            str[i++]=x+'0';        else            str[i++]='A'+(x-10);        val=val/R;    }    str[i]=0;    Strrev(str);}bool OK(int val){    int cou=0;    char tmp[LN];    for(int i=2; i<=10; ++i)    {        Convers(val,tmp,i);        if(Judge(tmp)) cou++;        if(cou>=2)            return true;    }    return false;}int main(){    freopen("dualpal.in","r",stdin);    freopen("dualpal.out","w",stdout);    int N,S;    scanf("%d%d",&N,&S);    for(int i=S+1,cou=0; cou<N; ++i)    {        if(OK(i))        {            printf("%d\n",i);            cou++;        }    }    return 0;}


原创粉丝点击