2018年全国多校算法寒假训练营练习比赛(第二场)

Posted leonard-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018年全国多校算法寒假训练营练习比赛(第二场)相关的知识,希望对你有一定的参考价值。

A

用栈模拟,注意最后要换行。(这里wrong了好久...)

技术分享图片
 1 //A
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 
 5 #define PI acos(-1.0)
 6 #define INF 1e18
 7 #define inf 0x3f3f3f3f
 8 #define FAST_IO ios::sync_with_stdio(false)
 9 
10 typedef long long LL;
11 
12 int main(){
13     string s;
14     while(cin>>s){
15         stack <char> st;
16         stack <char> ans;
17         int len=s.size();
18         for(int i=0;i<len;i++){
19             if(st.empty()) st.push(s[i]);
20             else if(s[i]==O){
21                 char c=st.top();
22                 if(c==O) st.pop();
23                 else st.push(s[i]);
24             }
25             else if(s[i]==o){
26                 char c=st.top();
27                 if(c==o){
28                     st.pop();
29                     if(st.empty()) st.push(O);
30                     else{
31                         char tmp=st.top();
32                         if(tmp==O) st.pop();
33                         else st.push(O);
34                     }
35                 }
36                 else st.push(s[i]);
37             }
38         }
39         while(!st.empty()){
40             ans.push(st.top());
41             st.pop();
42         }
43         while(!ans.empty()){
44             cout<<ans.top();
45             ans.pop();
46         }
47         cout<<endl;
48     }
49     return 0;
50 }
View Code

B

01背包的思想。dp[j][k]表示容量为j时,利用BUG拿第k个物品时能得到的最大威力值。注意题目中提到装备背包的时候才能利用BUG。如果h=0,表示没有装备背包,无法使用BUG。(比赛时写了个错误贪心+DP过了...)

给组测试数据:

4 5 5
3 1
3 2
4 1
3 1 

答案应该是5

技术分享图片
 1 //B
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 
 5 #define PI acos(-1.0)
 6 #define INF 1e18
 7 #define inf 0x3f3f3f3f
 8 #define FAST_IO ios::sync_with_stdio(false)
 9 
10 typedef long long LL;
11 int n,m,h,ans;
12 int w[123],v[123],dp[234][123];
13 
14 int main(){
15     while(cin>>n&&n!=0){
16         cin>>m>>h;
17         ans=0;
18         memset(dp,0,sizeof(dp));
19         for(int i=1;i<=n;i++) cin>>w[i]>>v[i];
20         for(int i=1;i<=n;i++){
21             for(int j=m+h;j>=w[i];j--){
22                 for(int k=1;k<=n;k++){
23                     if(i==k)continue;//因为不可能既用wi的背包体积装第i件物品,又用BUG再装一次,这样的话vi被算了两次
24                     dp[j][k]=max(dp[j][k],dp[j-w[i]][k]+v[i]);
25                     ans=max(ans,dp[j][k]+((j==m+h||h==0)?0:v[k]));
26                 }
27             }
28         }
29         cout<<ans<<endl;
30     }
31     return 0;
32 }
View Code

D

最长不下降子序列,裸题,O(n^2)即可

技术分享图片
 1 //D
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 
 5 #define PI acos(-1.0)
 6 #define INF 1e18
 7 #define inf 0x3f3f3f3f
 8 #define FAST_IO ios::sync_with_stdio(false)
 9 
10 typedef long long LL;
11 
12 int h[123],dp[123];
13 
14 int main(){
15     int n;
16     cin>>n;
17     for(int i=1;i<=n;i++){
18         cin>>h[i];
19         dp[i]=1;
20     }
21 
22     if(n<30) {cout<<"no"<<endl;return 0;}
23     for(int i=1;i<=n;i++){
24         for(int j=i-1;j>=1;j--){
25             if(h[i]>=h[j]) dp[i]=max(dp[i],dp[j]+1);
26         }
27     }
28 
29     int MAX=-1;
30     for(int i=1;i<=n;i++){
31         if(dp[i]>MAX)
32         MAX=dp[i];
33     }
34 
35     if(MAX>=30) cout<<"yes"<<endl;
36     else cout<<"no"<<endl;
37 
38     return 0;
39 }
View Code

E

树的重心。代码思路很清晰,直接看代码吧。

技术分享图片
 1 //E
 2 //树的重心定义为:找到一个点,其所有的子树中最大的子树节点数最少
 3 //那么这个点就是这棵树的重心删去重心后,生成的多棵树尽可能平衡
 4 #include <bits/stdc++.h>
 5 using namespace std;
 6 
 7 #define PI acos(-1.0)
 8 #define INF 1e18
 9 #define inf 0x3f3f3f3f
10 #define FAST_IO ios::sync_with_stdio(false)
11 
12 typedef long long LL;
13 const int N=1234;
14 int n,cnt,ans,ans_size;
15 
16 int vis[N],son[N];
17 vector <int> E[N];
18 
19 void init(){
20     cnt=0;ans_size=inf;
21     memset(vis,0,sizeof(vis));
22     for(int i=0;i<N;i++) E[i].clear();
23 }
24 
25 void dfs(int cur){
26     vis[cur]=1;
27     son[cur]=0;
28     int tmp=0;
29     for(int i=0;i<E[cur].size();i++){
30         int u=E[cur][i];
31         if(!vis[u]){
32             dfs(u);
33             son[cur]+=son[u]+1;
34             tmp=max(tmp,son[u]+1);
35         }
36     }
37     tmp=max(tmp,n-son[cur]-1);
38     if((tmp<ans_size)||(tmp==ans_size&&cur<ans)){
39         ans=cur;
40         ans_size=tmp;
41     }
42 }
43 
44 int main(){
45     int u,v;
46     while(cin>>n){
47         init();
48         for(int i=1;i<n;i++){
49             cin>>u>>v;
50             E[u].push_back(v);
51             E[v].push_back(u);
52         }
53         dfs(1);
54         cout<<ans<<" "<<ans_size<<endl;
55     }
56     return 0;
57 }
View Code

F

状态压缩DP入门题(POJ3254)

技术分享图片
 1 //F
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 
 5 #define PI acos(-1.0)
 6 #define INF 1e18
 7 #define inf 0x3f3f3f3f
 8 #define FAST_IO ios::sync_with_stdio(false)
 9 
10 typedef long long LL;
11 const int MOD=100000000;
12 int st[1<<13],Map[1<<13];
13 LL dp[13][1<<13];
14 
15 bool Judge1(int x){
16     return (x&(x<<1));
17 }
18 
19 bool Judge2(int i,int x){
20     return (Map[i]&st[x]);
21 }
22 
23 int main(){
24     int n,m,x;
25     while(cin>>n>>m){
26         memset(st,0,sizeof(st));
27         memset(Map,0,sizeof(Map));
28         memset(dp,0,sizeof(dp));
29         for(int i=1;i<=n;i++){
30             for(int j=1;j<=m;j++){
31                 cin>>x;
32                 if(x==0) Map[i]+=(1<<(j-1));
33             }
34         }
35         int k=0;
36         for(int i=0;i<(1<<m);i++){
37             if(!Judge1(i)) st[k++]=i;
38         }
39         for(int i=0;i<k;i++){
40             if(!Judge2(1,i)) dp[1][i]=1;
41         }
42 
43         for(int i=2;i<=n;i++){
44             for(int j=0;j<k;j++){
45                 if(Judge2(i,j)) continue;
46                 for(int f=0;f<k;f++){
47                     if(Judge2(i-1,f)) continue;
48                     if(!(st[j]&st[f])) dp[i][j]+=dp[i-1][f];
49                 }
50             }
51         }
52         LL ans=0;
53         for(int i=0;i<k;i++){
54             ans+=dp[n][i];
55             ans%=MOD;
56         }
57         cout<<ans<<endl;
58     }
59 
60     return 0;
61 }
View Code

G

暴力打表,再判断。

技术分享图片
 1 //G
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 
 5 #define PI acos(-1.0)
 6 #define INF 1e18
 7 #define inf 0x3f3f3f3f
 8 #define FAST_IO ios::sync_with_stdio(false)
 9 
10 const int N=1000000+10;
11 typedef long long LL;
12 int vis[N];
13 
14 int main(){
15     int n,m;
16     for(int i=1;i<N;i++){
17         int t=i;
18         while(t){
19             if(t%10==4||t%100==38) {vis[i]=1;break;}
20             t/=10;
21         }
22     }
23     while(cin>>n>>m){
24         int cnt=0;
25         if(n==0&&m==0) break;
26         for(int i=n;i<=m;i++){
27             if(vis[i]) cnt++;
28         }
29         cout<<cnt<<endl;
30     }
31     return 0;
32 }
View Code

H

规律题。f[i]=f[i-1]+f[i-2]+f[i-3]

技术分享图片
 1 //H
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 
 5 #define PI acos(-1.0)
 6 #define INF 1e18
 7 #define inf 0x3f3f3f3f
 8 #define FAST_IO ios::sync_with_stdio(false)
 9 
10 typedef long long LL;
11 LL f[60];
12 
13 int main(){
14     f[1]=0,f[2]=1,f[3]=1;
15     for(int i=4;i<60;i++) f[i]=f[i-1]+f[i-2]+f[i-3];
16     int n;
17     while(cin>>n){
18         cout<<f[n]<<endl;
19     }
20     return 0;
21 }
View Code

 

以上是关于2018年全国多校算法寒假训练营练习比赛(第二场)的主要内容,如果未能解决你的问题,请参考以下文章

2018年全国多校算法寒假训练营练习比赛(第二场)

2018年全国多校算法寒假训练营练习比赛(第二场)B - TaoTao要吃鸡

2018年全国多校算法寒假训练营练习比赛(第二场)A.吐泡泡

2018年全国多校算法寒假训练营练习比赛(第二场)F - 德玛西亚万岁

吐泡泡(2018年全国多校算法寒假训练营练习比赛(第二场)+栈模拟)+Plug-in(codeforces81A+栈模拟)

2018年全国多校算法寒假训练营练习比赛(第五场):A题:逆序数