1.Codeforces Round #656 (Div. 3) A
题意:给定三个数,求另三个数,两两比较的大数正好是给定的三个数。
#include<iostream>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#include<ostream>
#include<istream>
typedef long long ll;
using namespace std;
#define mod 1e9+7
#define PI acos(-1.0)
const ll maxn=2*1e5;
const int mx=(1<<20)+99;
ll n,m,k,a[4],flag,aans,ans;
int main()
{
cin.tie(0);
ios::sync_with_stdio(0);
int t;
cin>>t;
for(int o=1;o<=t;o++)
{
cin>>a[1]>>a[2]>>a[3];
sort(a+1,a+4);
aans=1;
if(a[1]==a[2]) aans++;
if(a[2]==a[3]) aans++;
if(aans==1) cout<<"NO"<<endl;
if(aans==3) cout<<"YES"<<endl<<a[1]<<" "<<a[1]<<" "<<a[1]<<endl;
if(aans==2)
{
if(a[1]==a[2]) cout<<"NO"<<endl;
else cout<<"YES"<<endl<<a[1]<<" "<<a[1]<<" "<<a[2]<<endl;
}
}
return 0;
}
2.Codeforces Round #656 (Div. 3) B
题意:给定一个数组中元素每个数都有两个(是按照一定规则生成的),输出原数组。总之按照出现的先后顺序输出即可。
#include<iostream>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#include<ostream>
#include<istream>
typedef long long ll;
using namespace std;
#define mod 1e9+7
#define PI acos(-1.0)
const ll maxn=2*1e5;
const int mx=(1<<20)+99;
ll n,m,k,a[300],flag[300],aans,ans;
int main()
{
cin.tie(0);
ios::sync_with_stdio(0);
int t;
cin>>t;
for(int o=1;o<=t;o++)
{
cin>>n;
memset(flag,0,sizeof(flag));
for(int i=1;i<=2*n;i++)
{
cin>>a[i];
if(!flag[a[i]]) { cout<<a[i]<<" "; flag[a[i]]=1; }
}
cout<<endl;
}
return 0;
}
3.Codeforces Round #656 (Div. 3) C
题意:给定一个数组,求删除前几个元素后剩下的每次从最前面或最后面拿出一个元素可以得到一个不下降序列。求需要删除的最少元素个数。
昨晚做题时没能过,今天一看其实挺简单,只需要使得剩余的元素至多一个极值点即可。做法是从后往前看(因为要删除前面的元素),设置三个标识记录变化趋势(不严格减小,不严格增大还有不变),其中不变只在开头判断(即数组末尾几个元素),然后实现三种判断间的转换连结即可。(实现剩余数组元素:大小都相同,单调不严格递增,单调不严格递减,先不严格递增后不严格递减。之一即可)
#include<iostream>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#include<ostream>
#include<istream>
typedef long long ll;
using namespace std;
#define mod 1e9+7
#define PI acos(-1.0)
const ll maxn=2*1e5;
const int mx=(1<<20)+99;
ll n,m,k,a[maxn+10],aans,ans,flag1,flag2,flag3;
int main()
{
cin.tie(0);
ios::sync_with_stdio(0);
int t;
cin>>t;
for(int o=1;o<=t;o++)
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
if(n<=2) { cout<<"0"<<endl; continue; }
flag1=1; flag2=flag3=aans=0;
for(int i=n-1;i>0;i--)
{
if(flag1)
{
if(i==1)
{
cout<<"0"<<endl;
break;
}
if(a[i]==a[i+1]) continue;
if(a[i]<a[i+1])
{
flag1=0;
flag3=1;
continue;
}
else
{
flag1=0;
flag2=1;
continue;
}
}
if(flag2)
{
if(a[i]<a[i+1])
{
flag2=0;
flag3=1;
}
if(a[i]>=a[i+1]&&i==1)
{ cout<<"0"<<endl; break; }
}
if(flag3)
{
if(a[i]<=a[i+1]&&i==1)
{ cout<<"0"<<endl; break; }
if(a[i]>a[i+1])
{
cout<<i<<endl;
break;
}
}
}
}
return 0;
}
4.Codeforces Round #656 (Div. 3) D
题意:给定一个字符串,求将它变成good串需要修改的最少字符数。字符串关于字符s的good串即该字符串的1/2连续字符是字符s且另1/2连续字符也是一个关于字符s+1的good串,当字符(子)串只剩一个字符时只要其是字母顺序的下一个字母即可(意思不是子串的话是a)。
这个题题目就在用最通俗易懂的英语呐喊,这是递归。而且题目的数据范围在时间复杂度上也没设置难度,所以,其实比C题还简单,所以一次ac的。
#include<iostream>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#include<ostream>
#include<istream>
typedef long long ll;
using namespace std;
#define mod 1e9+7
#define PI acos(-1.0)
const ll maxn=2*1e5;
const int mx=(1<<20)+99;
ll n,m,k,aans,ans;
char a[maxn];
ll st(char s,ll l,ll r)
{
if(l==r) return a[l]==s?0:1;
ll l0,r0;
l0=r0=0;
for(int i=l;i<=(l+r-1)/2;i++)
if(a[i]!=s) l0++;
for(int i=(l+r-1)/2+1;i<=r;i++)
if(a[i]!=s) r0++;
//cout<<l<<" "<<r<<" "<<l0<<" "<<r0<<endl;
return min(r0+st(char(s+1),l,(l+r-1)/2),l0+st(char(s+1),(l+r-1)/2+1,r));
}
int main()
{
cin.tie(0);
ios::sync_with_stdio(0);
int t;
cin>>t;
for(int o=1;o<=t;o++)
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
cout<<st('a',1,n)<<endl;
}
return 0;
}
5.Codeforces Round #656 (Div. 3) E
题意:给定一些点和这些点的线段,有的有向有的无向,给无向线段加上方向使其不会出现环(有向无环图)。
#include<iostream>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<map>
#include<queue>
#include<vector>
#include<utility>
#include<ostream>
#include<istream>
typedef long long ll;
using namespace std;
#define mod 1e9+7
#define PI acos(-1.0)
const ll maxn=2*1e5;
const int mx=(1<<20)+99;
ll n,m,k,ans,aans,deg[maxn],head[maxn],pos[maxn],cnt,tot;
struct lll{
ll x,y;
} a[maxn+100];
vector<pair<ll,ll> > v;
queue<ll> q;
void add(ll p,ll q)
{
a[++cnt].x=q;
a[cnt].y=head[p];
head[p]=cnt;
}
int main()
{
cin.tie(0);
ios::sync_with_stdio(0);
int t;
cin>>t;
for(int o=1;o<=t;o++)
{
cin>>n>>m;
v.clear();
cnt=tot=0;
for(int i=1;i<=n;i++)
{
pos[i]=deg[i]=head[i]=0;
}
for(int i=1,x,y,z;i<=m;i++)
{
cin>>x>>y>>z;
v.push_back(make_pair(y,z));
if(x==1)
{
add(y,z);
deg[z]++;
}
}
for(int i=1;i<=n;i++)
{
if(deg[i]==0)
{
q.push(i);
}
}
while(!q.empty())
{
int c=q.front();
q.pop();
pos[c]=++tot;
for(int i=head[c];i;i=a[i].y)
{
deg[a[i].x]--;
if(deg[a[i].x]==0)
{
q.push(a[i].x);
}
}
}
if(tot!=n)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
for(int i=0;i<v.size();i++)
{
if(pos[v[i].first]>pos[v[i].second])
{
swap(v[i].first,v[i].second);
}
cout<<v[i].first<<" "<<v[i].second<<endl;
}
}
}
return 0;
}
总结:昨晚cf网页怎么也打不开,提交上也不知道对错,所以对做题速度也有一定影响,而且昨晚太困了,所以做题效果不怎么样,如果正常做的话,起码A,B,D没什么问题,C代码实现时不要钻牛角尖应该也可以的。感觉这段时间的训练都注重在实现代码上,而对于偏难题目的思维方面稍稍忽略了些,不过代码实现上也有效果,起码C题我没想到那么顺利。至于D题可能就是拿出递归知识来水水罢了吧。