Codeforces Round #656 (Div. 3)
A.Three Pairwise Maximums
观察可以发现构造出来的数必定有两个数为三个数里的最大数,先特判
再分别输出两个不同的数字和0即可
#include<bits/stdc++.h>
using namespace std;
int n,m,t,k;
int a[5];
void shit();
int main(){
cin>>t;
while(t--){
cin>>a[1]>>a[2]>>a[3];
sort(a+1,a+4);
if(a[2]!=a[3])printf("NO\n");
else{
printf("YES\n%d %d 1\n",a[1],a[3]);
}
}
return 0;
}
B.Restore the Permutation by Merger
sb
#include<bits/stdc++.h>
using namespace std;
int n,m,t,k;
int a[100005];
int vis[105];
int main(){
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=2*n;i++){
cin>>a[i];
}
vector<int>jl;
for(int i=1;i<=2*n;i++){
if(!vis[a[i]]){
vis[a[i]]=1;
jl.push_back(a[i]);
}
}
for(auto v:jl){
printf("%d ",v);
}
cout<<endl;
memset(vis,0,sizeof vis);
}
return 0;
}
C.Make It Good
后往前,连续的升再降,再升就 b r e a k break break,用总数减去即可
#include<bits/stdc++.h>
using namespace std;
int n,m,t,k;
int a[200005];
int main(){
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int cnt=1;
int f=0;
for(int i=n;i>=2;i--){
if(a[i-1]>=a[i]&&!f){
cnt++;
continue;
}
if(a[i-1]>a[i]&&f){
break;
}
if(a[i-1]<=a[i]){
cnt++;
f=1;
continue;
}
}
cout<<n-cnt<<endl;
}
return 0;
}
D.a-Good String
分治,前后两段哪个变好的费用更少就选哪边,边界为长度为1的时候
#include<bits/stdc++.h>
using namespace std;
int n,m,t,k;
int fz(string a,char c,int len){
if(len==1)return a[0]!=c;
string l=a.substr(0,len/2);
string r=a.substr(len/2);
return min(fz(l,c+1,len/2)+len/2-count(r.begin(),r.end(),c),fz(r,c+1,len/2)+len/2-count(l.begin(),l.end(),c));
}
int main(){
cin>>t;
while(t--){
cin>>n;
string a;
cin>>a;
int ans=fz(a,'a',a.length());
cout<<ans<<endl;
}
return 0;
}
E.Directing Edges
先连上有向边,进行拓扑排序,判断是否有环
再依次输出无向边,从拓扑次序小的对大的连边
#include<bits/stdc++.h>
using namespace std;
int n,m,t,k;
const int maxn=2e5+5;
int cnt=0;
int head[200005];
struct edge{
int v,nex;
}e[200005];
void add(int u,int v){
e[++cnt].v=v;
e[cnt].nex=head[u];
head[u]=cnt;
}
struct node{
int x,y;
}g[maxn],g2[maxn];
int ru[maxn],cx[maxn];
bool topo(){
queue<int>q;
for(int i=1;i<=n;i++){
if(!ru[i]){
q.push(i);
}
}
int tt=0;
while(!q.empty()){
int u=q.front();
cx[u]=++tt;
q.pop();
for(int i=head[u];i;i=e[i].nex){
int v=e[i].v;
ru[v]--;
if(!ru[v]){
q.push(v);
}
}
}
if(tt<n)return false;
return true;
}
int main(){
cin>>t;
while(t--){
cin>>n>>m;
int c=0;
int c2=0;
memset(head,0,sizeof head);
memset(ru,0,sizeof ru);
memset(cx,0,sizeof cx);
for(int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
if(x)add(y,z),ru[z]++,g2[++c2].x=y,g2[c2].y=z;
else{
g[++c].x=y;
g[c].y=z;
}
}
if(topo()==false){
printf("NO\n");
continue;
}
else printf("YES\n");
for(int i=1;i<=c;i++){
int x=g[i].x;
int y=g[i].y;
if(cx[x]<cx[y]){
printf("%d %d\n",x,y);
}
else printf("%d %d\n",y,x);
}
for(int i=1;i<=c2;i++){
int x=g2[i].x;
int y=g2[i].y;
printf("%d %d\n",x,y);
}
}
return 0;
}
F.Removing Leaves
2300的题,咕 咕 咕
G.Columns Swaps
2300的题,咕 咕 咕