Educational Codeforces Round 19 题解【ABCDE】
2017-04-16 15:29
676 查看
A. k-Factorization
题意:给你一个n,问你这个数能否分割成k个大于1的数的乘积。题解:因为n的取值范围很小,所以感觉dfs应该不会有很多种可能……
#include<bits/stdc++.h> using namespace std; long long n; int k; vector<int> ans; void dfs(int x,long long now,int st){ if(x==k&&now==n){ for(int i=0;i<ans.size();i++){ cout<<ans[i]<<" "; } cout<<endl; exit(0); } for(int i=st;i<=n;i++){ if(i*now>n)break; ans.push_back(i); dfs(x+1,now*i,i); ans.pop_back(); } } int main(){ cin>>n>>k; dfs(0,1,2); cout<<"-1"<<endl; }
B. Odd sum
题意:让你找到一个子序列,要求和为奇数,且和最大。题解:首先让所有正数都加起来,如果答案此时为奇数,直接输出。否则你要么减去一个正奇数,要么加上一个负奇数。
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5+7; long long a[maxn]; int n; long long sum = 0; int main(){ scanf("%d",&n); long long Tmp = 1e18; for(int i=1;i<=n;i++){ cin>>a[i]; if(a[i]>0)sum+=a[i]; if(abs(a[i])%2==1)Tmp=min(Tmp,abs(a[i])); } if(sum%2==1)cout<<sum<<endl; else cout<<sum-Tmp<<endl; }
C. Minimal string
题意:你有一个串s,你有两个操作。第一个操作是从s的开头扔一个串到t的结尾。第二个操作是扔t的结尾到u的结尾。问你怎么操作,才能使得u的字典序最小。
题解:贪心,记录后缀最小值。如果当前t存的已经是后缀最小值的最小了,那就直接输出就好了。
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5+7; char s[maxn],t[maxn],u[maxn],mn[maxn]; int main(){ scanf("%s",s); int len = strlen(s); mn[len]='z'+1; int len2 = 0; for(int i=len-1;i>=0;i--) mn[i]=min(mn[i+1],s[i]); int len3 = 0; for(int i=0;i<len;i++){ t[len2++]=s[i]; while(len2&&t[len2-1]<=mn[i+1]) u[len3++]=t[--len2]; } printf("%s\n",u); }
D. Broken BST
题意:给你一个二叉树,让你用题目中的代码(搜索二叉树)去找每一个节点的值,问你哪些值找不到。题解:就模拟就好了。唯一的坑点就是节点的val会有相同的情况,这种只需要找到val一样的点就好,并不需要找到同样的那个点。
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5+7; int n,v[maxn],l[maxn],r[maxn]; int ans,vis[maxn]; set<int> S; void dfs(int x,int L,int R){ if(L<v[x]&&v[x]<R){ S.insert(v[x]); } if(l[x]!=-1)dfs(l[x],L,min(R,v[x])); if(r[x]!=-1)dfs(r[x],max(L,v[x]),R); } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d%d",&v[i],&l[i],&r[i]); if(l[i]!=-1)vis[l[i]]++; if(r[i]!=-1)vis[r[i]]++; } for(int i=1;i<=n;i++){ if(vis[i]==0){ dfs(i,-2e9,2e9); } } for(int i=1;i<=n;i++) if(S.find(v[i])!=S.end()) ans++; cout<<n-ans<<endl; }
E. Array Queries
题意:给你n个数a[i]。然后q个询问,每个询问给你一个p和k,每次p = p + a[p] + k,直到p>n,问你会经过多少步。题解:根据k分块即可,小于sqrt的dp预处理,否则直接暴力……
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5+7; int a[maxn],n; int b[maxn][350]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=n;i>=1;i--){ for(int j=1;j<350;j++){ if(i+j+a[i]>n)b[i][j]=1; else b[i][j]=b[i+a[i]+j][j]+1; } } int q;scanf("%d",&q); for(int i=1;i<=q;i++){ int x,y;scanf("%d%d",&x,&y); if(y<350)printf("%d\n",b[x][y]); else{ int ans = 0; int now = x; while(now<=n){ ans = ans + 1; now = now + a[now] + y; } printf("%d\n",ans); } } }
相关文章推荐
- Educational Codeforces Round 19 ABCDE题解
- Educational Codeforces Round 19 ABCDE题解
- Educational Codeforces Round 19 A. k-Factorization
- Educational Codeforces Round 19
- Educational Codeforces Round 19 F(dp+队列优化)
- Educational Codeforces Round 19 题解
- Codeforces Round #200 (Div. 2) (ABCDE题解)
- Educational Codeforces Round 19 E. Array Queries
- Codeforces Educational Round 5 ABCDE
- Educational Codeforces Round 30 题解
- Educational Codeforces Round 19-E. Array Queries
- Educational Codeforces Round 7 ABCDE
- Codeforces Round #360 (Div. 2) ABCDE题解
- Educational Codeforces Round 19
- Educational Codeforces Round 19 B. Odd sum
- Educational Codeforces Round 19 E. Array Queries
- Educational Codeforces Round 32[题解]
- Codeforces Round #369 (Div. 2) ABCDE题解
- Educational Codeforces Round 19 A+B+C+E!
- Educational Codeforces Round 19 E. Array Queries