题目链接:https://codeforces.com/contest/1332
反复移动使两个方向步数抵消,然后看步数较多方向的长度是否大于等于余下步数。
#include <bits/stdc++.h> using namespace std; void solve() { int a,b,c,d; cin>>a>>b>>c>>d; int x,y,x1,x2,y1,y2; cin>>x>>y>>x1>>y1>>x2>>y2; int l1=max(x-x1,x2-x),l2=max(y2-y,y-y1); if(l1>0){//如果可以向左或向右走 int mi=min(a,b);//左右移动相互抵消 a-=mi,b-=mi; if(a>0&&a<=x-x1) a=0; if(b>0&&b<=x2-x) b=0; } if(l2>0){ int mi=min(c,d); c-=mi,d-=mi; if(c>0&&c<=y-y1) c=0; if(d>0&&d<=y2-y) d=0; } if(a||b||c||d) cout<<"No\n"; else cout<<"Yes\n"; } int main() { int t;cin>>t; while(t--) solve(); return 0; }
平方小于1000的只有11个质因数,最小质因数相同的染一个颜色即可。
#include <bits/stdc++.h> using namespace std; void solve() { int n;cin>>n; int res[n]={}; int color=0; map<int,int> m; for(int i=0;i<n;i++){ int t;cin>>t; for(int j=2;j<=t;j++){ if(t%j==0){ if(m[j]) res[i]=m[j];//如果该质因数之前已出现,该数染相同颜色即可 else res[i]=m[j]=++color;//否则给该质因数分配一个新颜色 break; } } } cout<<color<<"\n"; for(int i=0;i<n;i++) cout<<i<<" \n"[i==n-1]; } int main() { int t;cin>>t; while(t--) solve(); return 0; }
每次取两端字符和两端向内的周期字符,这些都是要一样的,换成里面最多的那个就可以了。
#include <bits/stdc++.h> using namespace std; void solve() { int n,k;cin>>n>>k; string s;cin>>s; int ans=0; bool vis[n]={}; for(int i=0;i<n;i++) { if(vis[i]) continue; vector<char> v; for(int j=i;j<n;j+=k) if(!vis[j]){ v.push_back(s[j]); vis[j]=true; } for(int j=n-i-1;j>=0;j-=k) if(!vis[j]){ v.push_back(s[j]); vis[j]=true; } int cnt[26]={}; for(char c:v) cnt[c-‘a‘]++; int mx=*max_element(cnt,cnt+26); ans+=int(v.size())-mx; } cout<<ans<<"\n"; } int main() { int t;cin>>t; while(t--) solve(); return 0; }
原来的dp代码会因为追求当前的最大与值而舍弃掉会使答案更大的较小值,按照相同思路构造即可。
#include <bits/stdc++.h> using namespace std; const int inf=1<<17; int main() { int k;cin>>k; cout<<"2 3\n"; cout<<(inf+k)<<‘ ‘<<k<<‘ ‘<<inf<<"\n"; cout<<inf<<‘ ‘<<(inf+k)<<‘ ‘<<k; return 0; }
Codeforces Round #630 (Div. 2)
原文:https://www.cnblogs.com/Kanoon/p/12609890.html