Codeforces Round #763
A
简单模拟
void slv(){
cin>>m>>n>>a>>b>>c>>d;
int fg1 = 1,fg2 = 1,ans=0;
while(a!=c&&b!=d){
if(fg1)
{
if(a<m) a++;
else fg1 = 0,a--;
}
else a--;
if(fg2)
{
if(b<n) b++;
else fg2 = 0,b--;
}
else b--;
ans++;
}
cout<<ans<<endl;
}
B
把x==y的情况剔除后按(y-x)的绝对值排序,后面必然在前面选剩下的选
bool cmp(nd a,nd b)
{
return a.x<b.x;
}
void slv(){
cin>>n;
rep(i,1,n) st[i] = false; k = 0;m= 0;
vector<nd> pt;
rep(i,1,n){
cin>>a[i]>>b[i];
if(a[i]==b[i])
{
st[a[i]] = 1;
cout<<a[i]<<' '<<b[i]<<' '<<a[i]<<endl;
}
else
{
nd aa = {b[i]-a[i],a[i],b[i]};
pt.pb(aa);
}
}
sort(all(pt),cmp);
for(auto x:pt){
//cout<<x.y<<' '<<x.z<<' ';
for(int i = x.y;i<=x.z;i++)
if(!st[i])
{
st[i]=1;
cout<<x.y<<' '<<x.z<<' '<<i<<endl;
break;
}
}
cout<<endl;
//cout<<"vvv";
}
C
二分最小值,check就从后面往前面贪心,保留最小值即可
bool ck(int x){
rep(i,1,n) b[i] = a[i],c[i] = 0;
per(i,3,n){
int num = max(min(b[i]/3,(b[i]+c[i]-x)/3),0);
b[i] -= 3*num;
c[i-1] += num;
c[i-2] += 2*num;
}
rep(i,1,n)
if(b[i] + c[i] < x) return 0;
return 1;
}
void slv(){
cin>>n;m = 1e9,ma = 0;
rep(i,1,n) {
cin>>a[i];
m = min(m,a[i]);
ma = max(ma,a[i]);
}
int l = m,r = ma;
while(l<=r)
{
int mid = (r+l)>>1;
if(ck(mid)) l = mid+1;
else r = mid-1;
}
if(!ck(l)) l--;
cout<<l<<endl;
}
应该是鸽了
本文来自博客园,作者:InsiApple,转载请注明原文链接:https://www.cnblogs.com/InsiApple/p/15749501.html