Codeforces Round 961 (Div. 2)

A - Diagonals

解题思路

​ 这道题就是让你把一堆东西按照对角线长度的大小来放,优先较长的,那么对于正方形来说,它的反对角线的长度划分为n、n-1、n-1、n-2、n-2…那么除了第一个其他的长度都是两个,那么可以预处理一下第一种情况。之后就是按照规律来安排剩余的对角线,我是通过判断奇偶数来判断是否要更行对角线的长度。

AC代码

#include 

using namespace std;

void solve () {
   
	int n,k;
	cin>>n>>k;
	int res = 0;
	bool flag = 1;
	if(k == 0) {
   
		cout<<0<<endl;
		return ;
	}
	if(k <= n) {
   
		cout<<1<<endl;
		return;
	}
	k -= n;
	res ++;
	while(k > 0) {
   
		if(res % 2) {
   
			n--;
		}
		k -= n;
		res++;
	}
	cout<<res<<endl;
}

int main () {
   
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	while(t--) {
   
		solve();
	}
	return 0;
} 

总结

​ 对于这种情况需要交替进行处理操作的时候,可以通过判断奇偶来进行处理。

B1 - Bouquet (Easy Version)

解题思路

​ 这道题思路是非常清晰的,首先排序,然后通过动态区间来查找满足条件的那个区间,可以遍历所有的值来当做左边界,然后通过二分寻找右边界,这样时间复杂度就到了 O ( n 2 ) O(n^2) O(n2),注意要满足两个条件,最后还要处理一下结果是0的情况。

AC代码

#include 

using namespace std;
typedef long long ll;
const int N = 2e5+10; 
ll a[N],sum[N];
ll n,m;

bool check(int x,int k) {
   
	ll ans = sum[x] - sum[k-1];
	if(a[x] - a[k] <= 1ll && ans <= m) {
   
		return true;
	}else {
   
		return false;
	}
}

ll dich(ll a[],ll sum[],int l,int r,int k) {
   
	
	while(l < r) {
   
		int mid = (l + r + 1) >> 1;
		if(check(mid,k)) l = mid;
		else r = mid - 1;
	}
	return sum[l] - sum[k-1];
}

void solve () {
   
	memset(a,0,sizeof a);
	memset(sum,0,sizeof sum);
	ll res = 0;
	cin>>n>>m;
	for(int i = 1;i <= n;i++) {
   
		cin>>a[i];
	}
	sort(a+1,a+n+1);
	for(int i = 1;i <= n;i++) {
   
		sum[i] = a[i

你可能感兴趣的:(Codeforces,算法)