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 }
View Code

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 }
View Code

 

posted on 2016-10-08 16:35  啊?  阅读(582)  评论(0编辑  收藏  举报