标签:
Poj,1840
题意很好懂。采用分治法直接把复杂度割掉2/5。
用short数组可以防止爆内存,int数组就GG了。
学习:考虑到爆内存,换范围小一点的。考虑时间,可以用滚动/动态滚动数组.dp[i][j] i或j可以变化不一定一开就很大。
其实就是也可以是hash表数据差不多。网上看了一下,似乎char和short都可以防止爆内存
其实数据50^4*3*2+5就可以了,防止越界加个5
1 #include <iostream> 2 #include <cstdio> 3 #include <map> 4 #include <cstring> 5 #define maxn 25000010 6 using namespace std; 7 8 typedef long long ll; 9 10 short cnt[maxn]; 11 int main() 12 { 13 int a1,a2,a3,a4,a5; 14 scanf("%d %d %d %d %d",&a1,&a2,&a3,&a4,&a5); 15 memset(cnt,0,sizeof(cnt)); 16 for(int x4=-50;x4<=50;x4++) 17 { if(!x4) 18 continue; 19 for(int x5=-50;x5<=50;x5++) 20 { 21 if(!x5) 22 continue; 23 cnt[x4*x4*x4*a4+x5*x5*x5*a5+12500000]++; 24 } 25 } 26 int count=0; 27 for(int x1=-50;x1<=50;x1++) 28 { 29 if(!x1) 30 continue; 31 for(int x2=-50;x2<=50;x2++) 32 { 33 if(!x2) 34 continue; 35 for(int x3=-50;x3<=50;x3++) 36 { 37 if(!x3) 38 continue; 39 int y=a1*x1*x1*x1+a2*x2*x2*x2+a3*x3*x3*x3; 40 y*=-1; 41 if(y<=12500000&&y>=-12500000) 42 count+=cnt[y+12500000]; 43 } 44 } 45 } 46 47 printf("%d\n",count); 48 return 0; 49 }
Poj,2153
自己的思路是对的,注意每次输入之后用getchar()接收空格。要不然数据会是空。
1 #include <iostream> 2 #include <cstdio> 3 #include <map> 4 #include <string.h> 5 6 using namespace std; 7 8 typedef pair<string,int> PAIR; 9 10 struct cmp 11 { 12 bool operator()(const PAIR& x,const PAIR& y) 13 { 14 return x.second>y.second; 15 } 16 }; 17 18 string s; 19 map<string,int> mp; 20 int main() 21 { 22 int N; 23 int M,S,count; 24 scanf("%d",&N); 25 getchar(); 26 for(int i=0;i<N;i++) 27 { 28 getline(cin,s); 29 mp[s]=0; 30 } 31 scanf("%d",&M); 32 getchar(); 33 for(int j=0;j<M;j++) 34 { 35 for(int i=0;i<N;i++) 36 { 37 cin>>S; 38 getchar(); 39 getline(cin,s); 40 mp[s]+=S; 41 } 42 count=1; 43 44 for(map<string,int>::iterator it=mp.begin();it!=mp.end();it++) 45 { 46 if(it->second>mp["Li Ming"]&&it->first!="Li Ming") 47 { 48 count++; 49 } 50 } 51 cout<<count<<endl; 52 } 53 return 0; 54 }
Poj,3481
一下就过了,开心~
1 #include <iostream> 2 #include <cstdio> 3 #include <map> 4 #include <string.h> 5 #include <algorithm> 6 7 using namespace std; 8 9 10 11 map<int,int> mp; 12 int main() 13 { 14 int K,P,R; 15 while(scanf("%d",&R) && R) 16 { 17 map<int,int>::iterator it; 18 map<int,int>::iterator rit; 19 if(R==1) 20 { 21 scanf("%d %d",&K,&P); 22 mp[P]=K; 23 continue; 24 } 25 if(mp.empty()) 26 { 27 puts("0"); 28 continue; 29 } 30 rit=mp.end(); 31 if(R==2) 32 { 33 printf("%d\n",(--rit)->second); 34 mp.erase(rit); 35 continue; 36 } 37 it=mp.begin(); 38 if(R==3) 39 { 40 printf("%d\n",it->second); 41 mp.erase(it); 42 continue; 43 } 44 } 45 return 0; 46 }
HDU,4287 一下就过了,开心~
1 #include <iostream> 2 #include <cstdio> 3 #include <map> 4 #include <string.h> 5 #include <algorithm> 6 7 using namespace std; 8 const int maxn=5000; 9 10 map<char,int> np; 11 map<int,int> mp; 12 int n[maxn+5]; 13 char m[7]; 14 15 void init() 16 { 17 int j=3; 18 int count=2; 19 for(int i=1;i<=26;i++) 20 { 21 int k=i; 22 char c=‘a‘+i-1; 23 np[c]=count; 24 if(c>=‘r‘) 25 k--; 26 if(c>=‘y‘) 27 k--; 28 if(k%j==0) 29 { 30 count++; 31 } 32 } 33 } 34 35 int main() 36 { 37 init(); 38 int T; 39 int N,M; 40 scanf("%d",&T); 41 while(T--) 42 { 43 int i,j; 44 scanf("%d %d",&N,&M); 45 for(i=0;i<N;i++) 46 { 47 scanf("%d",&n[i]); 48 mp[n[i]]=0; //记得初始化 49 } 50 getchar(); 51 for(j=0;j<M;j++) 52 { 53 scanf("%s",m); 54 getchar(); 55 int k=0; 56 int S=0; 57 for(int k=0;k<strlen(m);k++) 58 { 59 S*=10; 60 S+=np[m[k]]; 61 } 62 mp[S]++; 63 } 64 for(i=0;i<N;i++) 65 printf("%d\n",mp[n[i]]); 66 } 67 return 0; 68 }
标签:
原文地址:http://www.cnblogs.com/do-it-best/p/5366184.html