USACO各种思想好题归纳
来源:互联网 发布:路由器端口是什么意思 编辑:程序博客网 时间:2024/05/17 03:54
Section 1.1
PROB 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;}
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;}
进制转换,很多没有做关于进制转换的题了,这个题也给了自己一个醒,不然都忘了怎么转换了……
/*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;}
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
- USACO各种思想好题归纳
- 思想归纳
- 常见思想归纳
- 分治思想解决常见问题归纳
- 各种网络协议知识归纳
- 各种数据结构的知识点归纳
- USACO Bessie Come Home,Dijkstra算法的好题
- USACO Section 1.4 clocks - 好恶心的搜索题
- 泛型编程~~好思想好思想
- 各种排序算法思想
- 各种排序思想
- USACO-奶牛叠罗汉--交换法贪心思想
- POJ 3040 Allowance(贪心,诠释思想的好题)
- 51nod1344-贪心&进制思想&好题-砝码称重
- 各种常见java.sql.SQLException归纳
- 各种常见排序算法归纳总结
- ORACLE各种常见java.sql.SQLException归纳
- 归纳总结C#中的各种定时器
- 5. linaro ubuntu移植
- 记忆开发极限
- linux 静态库动态库学习记录
- [bzoj][SCOI2008]天平
- 瑞利信道:从原理到实现
- USACO各种思想好题归纳
- 关于Context跟this
- 服务器编程入门(7)I/O复用
- 自学Linux---4(分割窗口)
- CMake使用入门
- [转]阶层分析
- windows batch 常用命令
- 合并两个有序线性表的元素(C语言版)
- Linux下Git和GitHub使用方法总结