您的位置:首页 > 其它

USACO Chapter1-Getting started Section 1.2

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

Milking Cows (milk2)

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

/*
ID:kkkwjx1
LANG:C++
TASK:milk2
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define Max(a,b) (a>b)?a:b
using 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:kkkwjx1
LANG:C++
TASK:transform
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#define INF 0x7f7f7f7f
using 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:kkkwjx1
LANG: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:kkkwjx1
LANG: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:kkkwjx1
LANG:C++
TASK:dualpal
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#define LN 30
using 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: