T1.笨小猴
给出一个单词求出现次数最多和最少之差是不是质数。
很水的。统计一下反正就26个字母。
T2.火柴棒等式
给出火柴棒数,求形如 a+b=c能拼成的等式个数。
先减去4根(+,=),然后枚举a,b,判断根数。
T3.传纸条
给出一个矩阵,求左上角到右下角走两次(每个格子最多一次)能取得的最大值。
首先可以写出f[i][j][k][l],为第一张走到i,j,另一张走到k,l时的最大值(因为可视为同时从1,1出发)。
f[i][j][k][l]=max(f[i-1][j][k-1][l],f[i-1][j][k][l-1],f[i][j-1][k-1][l],f[i][j-1][k][l-1]);
但是可以优化空间。因为i+j==k+l所以可以用f[x][y][z]表示共走了x步,第一张向下走了y步,另一张向下走了z步的情况。这种情况下要确保一张走过的另一张不能再走。所以代码如下(我打的??时间久了不记得了。。。)
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 int m,n,v[60][60],f[300][60][60]; 6 7 int main(){ 8 cin >> m >> n; 9 for(int i=1;i<=m;i++) 10 for(int j=1;j<=n;j++) 11 cin >> v[i][j]; 12 for(int i=1;i<=m+n-1;i++) 13 for(int j=0;j<=i&&j<=m;j++) 14 for(int k=j;k<=i&&k<=m;k++) 15 { 16 if(j!=k||i==m+n-1) 17 { 18 if(j<k-1) f[i][j][k]=max(f[i][j][k],f[i-1][j][k-1]); 19 if(j-1<k) f[i][j][k]=max(f[i][j][k],f[i-1][j-1][k]); 20 if(j-1<k-1) f[i][j][k]=max(f[i][j][k],f[i-1][j-1][k-1]); 21 if(j<k) f[i][j][k]=max(f[i][j][k],f[i-1][j][k]); 22 f[i][j][k]=f[i][j][k]+v[j][i-j+1]+v[k][i-k+1]; 23 } 24 } 25 cout << f[m+n-1][m][m] << "\n"; 26 }
T4.双栈排序
给出n个数的一种排列,求能否利用两个栈使出栈序列从小到大排序。
这个要分步来,首先考虑单栈排序。一个栈要排序,必须不存在 (i<j<k 且 v[k]<v[i]<v[j])的情况
那么双栈排序也是一样的,只是ij不能放到同一个栈里了。
那么可以用二分图染色,ij之间连线。染色的时候如果冲突就无解。否则优先a,b,c,d,进行操作直到完全出栈。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <stack> 6 using namespace std; 7 8 int n; 9 int a[1011]; 10 int k[1011]; 11 int nxt[10011],lst[10011],ed[10011],cnt; 12 int col[1011]; 13 stack<int> q1,q2; 14 15 void addedge(int a,int b) 16 { 17 nxt[++cnt]=lst[a];lst[a]=cnt;ed[cnt]=b; 18 nxt[++cnt]=lst[b];lst[b]=cnt;ed[cnt]=a; 19 } 20 21 void dfs(int nw,int cl) 22 { 23 if (!col[nw]) 24 col[nw]=cl; 25 else if(col[nw]!=cl) 26 { 27 cout << "0\n"; 28 exit(0); 29 } 30 else 31 return; 32 for (int i=lst[nw];i;i=nxt[i]) dfs(ed[i],3-cl); 33 } 34 35 int main() 36 { 37 cin >> n; 38 for (int i=1;i<=n;i++) 39 cin >> a[i]; 40 k[n]=a[n]; 41 for (int i=n-1;i>=1;i--) 42 k[i]=min(k[i+1],a[i]); 43 for (int i=1;i<=n;i++) 44 for (int j=i+1;j<n;j++) 45 if (k[j-1]<a[i] && a[j]>a[i]) 46 addedge(i,j); 47 for (int i=1;i<=n;i++) 48 if (!col[i]) 49 dfs(i,1); 50 int nww=1,tt=1; 51 while (1) 52 { 53 if (nww>n) break; 54 if (col[tt]==1&&(q1.empty()||q1.top()>a[tt])) 55 { 56 q1.push(a[tt]); 57 tt++; 58 cout << "a "; 59 continue; 60 } 61 if (!q1.empty() && q1.top()==nww) 62 { 63 cout << "b "; 64 nww++; 65 q1.pop(); 66 continue; 67 } 68 if (col[tt]==2&&(q2.empty()||q2.top()>a[tt])) 69 { 70 q2.push(a[tt]); 71 tt++; 72 cout << "c "; 73 continue; 74 } 75 if (!q2.empty() && q2.top()==nww) 76 { 77 cout << "d "; 78 nww++; 79 q2.pop(); 80 continue; 81 } 82 } 83 return 0; 84 }