Codeforces Round #401 (Div. 2)【A,B,C,D】
最近状态极差。。水题不想写,难题咬不动。。哎,CF的题那么简单,还搞崩了= =、真是巨菜无比。
题意:略。
思路:
构造出3!次变换,然后输出就好。
Code:
#include <bits/stdc++.h> using namespace std; int a[6][4]={{1,2,3},{2,1,3},{2,3,1},{3,2,1},{3,1,2},{1,3,2}}; int main() { int n,x; scanf("%d",&n); scanf("%d",&x); n%=6; int ans=a[n][x]; ans--; printf("%d\n",ans); return 0; }
题意:
比较一下,小的数字的那个人要打一下。求第二串的最少,第一串的最多。
思路:(弱弱觉得有点意思)
两个数组,先排下序.
(1)我要少一些,我从大的去匹配对方,而且先与对方大的去匹配最优,如果不行,最小的来匹配。
(2)我要多一些,那么我小的尽可能去贴小的,同理不行的话,我拿最大的过去
Code:
#include <bits/stdc++.h> using namespace std; typedef long long LL; char s1[1010],s2[1010]; int s[1010]; int m[1010]; int n; void solve1() { int k1=0,k2=0; int t1=n-1,t2=n-1; int ans1=0; while(k1<=t1&&k2<=t2) { if(m[t2]>=s[t1]) { t1--; t2--; } else { t1--; k2++; ans1++; } } printf("%d\n",ans1); } void solve2() { int k1=0,k2=0; int t1=n-1,t2=n-1; int ans2=0; while(k1<=t1&&k2<=t2) //小的贴小的,不行的话我最大的贴小的。 { if(s[k1]<m[k2]) { k1++; k2++; ans2++; } else { t1--; k2++; } } printf("%d\n",ans2); } int main() { scanf("%d",&n); scanf("%s%s",s1,s2); for(int i=0;i<n;i++) s[i]=s1[i]-'0'; for(int i=0;i<n;i++) m[i]=s2[i]-'0'; sort(s,s+n); sort(m,m+n); solve1(); solve2(); return 0; } /* 4 1234 2345 */
Codeforces777C:
就是直接搞就好了,对于每列可以尺取,也可以拿个临时变量作为当前最远位置,这里是预处理出一个数组存每个位置的最远距离。
Code
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int N=1e6+10; vector<int>xs[100010]; int num[100010]; int n,m; void solve() { for(int i=0;i<m;i++) { int tmp=-1; int L; for(int j=0;j<xs[i].size();j++) { int a=xs[i][j]; if(tmp==-1) L=j+1; else if(tmp>a) { num[L]=max(num[L],j); L=j+1; } tmp=a; } num[L]=max(num[L],n); } int tmp=-1; for(int i=1;i<=n;i++) { num[i]=max(num[i],tmp); tmp=max(num[i],tmp); } } int main() { int x,y; scanf("%d%d",&n,&m); for(int i=0;i<n;i++) for(int j=0;j<m;j++) { scanf("%d",&x); xs[j].push_back(x); } solve(); int Q; scanf("%d",&Q); while(Q--) { scanf("%d%d",&x,&y); if(num[x]>=y) puts("Yes"); else puts("No"); } return 0; }
Codeforces777D:
大水题。。
Code:
#include <bits/stdc++.h> using namespace std; typedef long long LL; vector<char>xs[500010]; int n; int len[500010]; char ss[500010]; int main() { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%s",ss); int yy=strlen(ss); for(int j=0;j<yy;j++) xs[i].push_back(ss[j]); } int t1,t2; len[n-1]=xs[n-1].size(); for(int i=n-2;i>=0;i--) { t1=0;t2=0; bool flag=true; if(len[i+1]==1) { len[i]=1; continue; } while(t1<len[i+1]&&t2<xs[i].size()) { if(xs[i+1][t1]==xs[i][t2]) { t1++; t2++; } else if(xs[i+1][t1]>xs[i][t2]) { len[i]=xs[i].size(); flag=false; break; } else break; } if(flag) len[i]=t2; } for(int i=0;i<n;i++) { for(int j=0;j<len[i];j++) cout<<xs[i][j]; puts(""); } return 0; } /* 3 #sima #simb #sima */