【CodeForces训练记录】Educational Codeforces Round 171 (Rated for Div. 2)

训练情况

赛后反思

B题二分没有考虑到细节情况

A题

我们构造垂直并且要最长,我们只需要取长宽的较小值,然后一个正方形,左上到右下,左下到右上即可。

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	int x,y,k; cin>>x>>y>>k;
	cout<<0<<" "<<min(x,y)<<" "<<min(x,y)<<" "<<0<<endl;
	cout<<0<<" "<<0<<" "<<min(x,y)<<" "<<min(x,y)<<endl;
}

signed main(){
	int T; cin>>T; while(T--)
	solve();
	return 0;
}

B题

我们观察到二分单调性,考虑进行二分答案,我们相邻的进行配对,比如 \(i=1,2\)\(i=3,4\) 这样,不合法的情况为两两相减的值 \(> k\),但是这仅限于偶数情况,要是奇数情况会多出来一个,此时就需要分奇偶考虑,对于奇数情况需要删掉一个点再两两相减,枚举去掉的那个点即可,偶数直接两两相减即可。

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int N = 2e3 + 3;

int n;
int a[N];

bool pd(int x){
	if(n&1){
		int ans = 0;
		for(int i = 1;i<=n;i++){
			vector<int> b(N+1);
			for(int j = 1;j<=n;j++) b[j] = a[j];
			b.erase(b.begin() + i);
			for(int j = 2;j<=b.size();j+=2){
				if(b[j] - b[j-1] > x){
					ans++;
					break;
				}
			}
		}
		if(ans == n) return false;
		else return true;
	} else {
		for(int i = 2;i<=n;i+=2){
			if(a[i] - a[i-1] > x) return false;
		}
		return true;
	}
}

void solve(){
	cin>>n;
	for(int i = 1;i<=n;i++) cin>>a[i];
	int l = 1,r = 1E18,m;
	while(l<r){
		m = l + r >> 1;
		if(pd(m)) r=m;
		else l=m+1;
	}	
	cout<<l<<endl;
}

signed main(){
	int T; cin>>T; while(T--)
	solve();
	return 0;
}
posted @ 2024-10-29 00:39  MNNUACM_2024ZY  阅读(237)  评论(1编辑  收藏  举报