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 }
B
01背包的思想。dp[j][k]表示容量为j时,利用BUG拿第k个物品时能得到的最大威力值。注意题目中提到装备背包的时候才能利用BUG。如果h=0,表示没有装备背包,无法使用BUG。(比赛时写了个错误贪心+DP过了...)
给组测试数据:
4 5 5
3 1
3 2
4 1
3 1
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 }
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 }
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 }
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 }
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 }
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 }