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;
	
}

应该是鸽了

posted @ 2021-12-30 16:39  InsiApple  阅读(25)  评论(0编辑  收藏  举报