USACO各种思想好题归纳

来源:互联网 发布:路由器端口是什么意思 编辑:程序博客网 时间:2024/05/17 03:54

Section 1.1PROB Broken Necklace

这里也是巧解……

/*ID:liwei101PROG:beadsLANG:C++*/#include <iostream>#include <cstdio>#include <fstream>#include <algorithm>#include <cmath>#include <deque>#include <vector>#include <list>#include <queue>#include <string>#include <cstring>#include <map>#include <set>#define PI acos(-1.0)#define mem(a,b) memset(a,b,sizeof(a))#define sca(a) scanf("%d",&a)#define pri(a) printf("%d\n",a)#define MM 1000002#define MN 2005#define INF 168430090using namespace std;typedef long long ll;int main(){    ifstream fin("beads.in");    ofstream fout("beads.out");    int n,i,go=0,pre=0,w=0,sum=0;    string s;    char c=' ';    fin>>n>>s;    s+=s; //圆圈字符串可以把其变为两个字母串连接,首尾相连即可……    for(i=0;i<n*2;i++)    {        if(s[i]=='w') go++,w++;        else if(s[i]==c) go++,w=0;        else        {            sum=max(go+pre,sum); //两端项链之和            pre=go-w;  //左端就是右端减去有字母w的个数            go=w+1; //右端往前刚开始的个数就是前面有字母w个数加上当前的一个            w=0;    //w个数重置为0            c=s[i]; //当前字母        }    }    sum=max(go+pre,sum);    fout<<(sum>n?n:sum)<<endl;    return 0;}






Section 1.2 
PROB Milking Cows
哈希思想……好神……也可以用线段树区间加lazy标记……不过好久不写线段树了,现在基本写不出来了。唉……重新学啊……这里觉得哈希比较爽罢了……

/*ID:liwei101PROG:milk2LANG:C++*/#include <iostream>#include <cstdio>#include <fstream>#include <algorithm>#include <cmath>#include <deque>#include <vector>#include <list>#include <queue>#include <string>#include <cstring>#include <map>#include <set>#define PI acos(-1.0)#define mem(a,b) memset(a,b,sizeof(a))#define sca(a) scanf("%d",&a)#define pri(a) printf("%d\n",a)#define MM 1000002#define MN 2005#define INF 168430090using namespace std;typedef long long ll;int hash[MM],s[3];int main(){    ifstream fin("milk2.in");    ofstream fout("milk2.out");    int n,i,j,a,b,Min=MM,Max=0;    fin>>n;    for(i=0; i<n; i++)    {        fin>>a>>b;        b--;        Min=min(Min,a);        Max=max(Max,b);        for(j=a; j<=b; j++)            hash[j]=1; //把出来过的标记为1    }    for(i=Min; i<Max; i+=j)    {        for(j=0; hash[i+j]==hash[i]; j++); //这句话就是为什么刚开始得:b--了,如果不减的话,这两句循环都得再减1才行……        s[hash[i]]=max(s[hash[i]],j); //哈希取址的思想真的太强大了……    }    fout<<s[1]<<' '<<s[0]<<endl;    return 0;}


section 1.2  Name That Number
刚开始是想把数字转化为字母接成字符串再在文件中查找的,不过太麻烦了,想想这些题目应该代码都比较少,所以反过来想……
把字母转化成数字不就容易很多了嘛!哎呀……思维确实不能定势啊!
/*ID:liwei101PROG:namenumLANG:C++*/#include <iostream>#include <cstdio>#include <fstream>#include <algorithm>#include <cmath>#include <deque>#include <vector>#include <list>#include <queue>#include <string>#include <cstring>#include <map>#include <set>#define PI acos(-1.0)#define mem(a,b) memset(a,b,sizeof(a))#define sca(a) scanf("%d",&a)#define pri(a) printf("%d\n",a)#define MM 1000002#define MN 2005#define INF 168430090using namespace std;typedef long long ll;int main(){    ifstream fin("namenum.in");    ofstream fout("namenum.out");    ifstream dict("dict.txt");    string s,ss;    int a[27],flag=1;    a['A'-'A']=a['B'-'A']=a['C'-'A']=2;    a['D'-'A']=a['E'-'A']=a['F'-'A']=3;    a['G'-'A']=a['H'-'A']=a['I'-'A']=4;    a['J'-'A']=a['K'-'A']=a['L'-'A']=5;    a['M'-'A']=a['N'-'A']=a['O'-'A']=6;    a['P'-'A']=a['R'-'A']=a['S'-'A']=7;    a['T'-'A']=a['U'-'A']=a['V'-'A']=8;    a['W'-'A']=a['X'-'A']=a['Y'-'A']=9;    fin>>ss;    while(dict>>s)    {        string sss;        for(int i=0;i<s.size();i++)        {            sss+=a[s[i]-'A']+'0';        }        if(sss==ss) {fout<<s<<endl;flag=0;}    }    if(flag) fout<<"NONE"<<endl;    return 0;}

section 1.2  Palindromic Squares
进制转换,很多没有做关于进制转换的题了,这个题也给了自己一个醒,不然都忘了怎么转换了……
/*PROG:palsquareLANG:C++ID:liwei101*/#include <iostream>#include <cstdio>#include <fstream>#include <algorithm>#include <cmath>#include <deque>#include <vector>#include <list>#include <queue>#include <string>#include <cstring>#include <map>#include <stack>#include <set>#define PI acos(-1.0)#define mem(a,b) memset(a,b,sizeof(a))#define sca(a) scanf("%d",&a)#define pri(a) printf("%d\n",a)#define f(i,a,n) for(i=a;i<n;i++)#define F(i,a,n) for(i=a;i<=n;i++)#define MM 1000002#define MN 5005#define INF 1000000007using namespace std;typedef long long ll;char fuck[22]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};string convert(int i,int b){    string a;    while(i)    {        a+=fuck[i%b];        i/=b;    }    for(int i=0,j=a.size()-1;i<j;i++,j--)    {        char c=a[i];        a[i]=a[j];        a[j]=c;    }    return a;}int cmp(string s){    int i,j;    for(i=0,j=s.size()-1;i<j;i++,j--)        if(s[i]!=s[j]) return 0;    return 1;}int main(){    ofstream fout("palsquare.out");    ifstream fin("palsquare.in");    int i,b;    fin>>b;    for(i=1;i<=300;i++)    {        string s1=convert(i,b);        string s2=convert(i*i,b);        if(cmp(s2)) fout<<s1<<' '<<s2<<endl;    }    return 0;}

section 1.2  

PROB Dual Palindromes又是一道进制转化题……修正了string的倒序快速用法……
/*PROG:dualpalLANG:C++ID:liwei101*/#include <iostream>#include <cstdio>#include <fstream>#include <algorithm>#include <cmath>#include <deque>#include <vector>#include <list>#include <queue>#include <string>#include <cstring>#include <map>#include <stack>#include <set>#define PI acos(-1.0)#define mem(a,b) memset(a,b,sizeof(a))#define sca(a) scanf("%d",&a)#define pri(a) printf("%d\n",a)#define f(i,a,n) for(i=a;i<n;i++)#define F(i,a,n) for(i=a;i<=n;i++)#define MM 200002#define MN 5005#define INF 1000000007using namespace std;typedef long long ll;char fuck[11]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};string convert(int i,int b){    string a;    while(i)    {        a.insert(a.begin(),fuck[i%b]); //从开头插入字符,就把倒序变成正序了        i/=b;    }    return a;}int cmp(string s){    int i,j;    for(i=0,j=s.size()-1;i<j;i++,j--)        if(s[i]!=s[j]) return 0;    return 1;}int main(){    ofstream fout("dualpal.out");    ifstream fin("dualpal.in");    int i,j,n,m,ans=0,sum=0,flag=0;    fin>>n>>m;    for(i=m+1;;i++)    {        sum=0;        for(j=2;j<11;j++)        {            string s1=convert(i,j);            if(cmp(s1)&&(++sum)==2)            {                fout<<i<<endl;                if(++ans==n) flag=1;                break;            }        }        if(flag) break;    }    return 0;}




PROB Dual Palindromes
0 0
原创粉丝点击