Codeforces Round 926 (Div. 2)

Problem - A - Codeforces

长度为n的数组a(数[1,1e9])n大于等于2
重新排列数组a,使得ai-ai-1的和最大
问最大是多少

后一个减去前一个,升序,总的和就是最大的减最小的

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=110;
int a[N];
int n;
void solve() {
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+1+n);
	cout<<a[n]-a[1]<<endl;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t=1;
    cin>>t;
	while(t--) {
		solve();
	}
	return 0;
}

 Problem - B - Codeforces

n * n的矩阵,给一些单元格着色,至少让k条对角线上,每条对角线上有一种颜色
最多有4*n-2条对角线

问最少涂几种颜色
操作性问题,对单元格进行操作,那么操作对象最小基本单元为单元格,就专注于一个单元格
发现第一行的n个都能产生2条对角线,然后最后一行除了首尾均能产生两条对角线,首尾均产生一条对角线
所以如果对角线条数小于等于(n+n-2)*2,那么是一个单元格产生两条对角线,超过的,1个单元格产生一条对角线

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
int n,k;
void solve() {
	cin>>n>>k;
	if(k<=2*(n+n-2)) cout<<k/2+(k%2!=0)<<endl;
	else{
		int ans=0;
		ans+=n+n-2;
		k-=2*(n+n-2);
		ans+=k;
		cout<<ans<<endl;
	}
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t=1;
    cin>>t;
	while(t--) {
		solve();
	}
	return 0;
}

Problem - C - Codeforces 

进行投注,下注y个硬币,如果赢了,那么变成y*k,如果输了就失去本金
最多连续输x次
最初有a硬币
问能否财富自由

考虑最坏的结果,连续输x次,然后赢一次
如果连续输了x次,那么可以放一个很大的数,把钱都赚回来,但是它赢一次输一次,这样无法确定什么时候赢,就不敢乱下注
不能让你凑成x次

第一次先投1,试探一下,如果赢了,那就相当于重新开始
如果输了,下次我们投那种我们赢了就可以赚的,这样它就只能让我们输,我们就靠这种方法逼它让我们输,一直输到连续x次,如果我们还有本金还可以赢的比最初的多,那么YES(不包括和最初的本金相等),否则NO

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
int k,x,a;
void solve() {
	cin>>k>>x>>a;
	int b=a;
	b--;//本金还剩多少
	int sum=1;//共花了多少
	for(int i=2;i<=x;i++){
		int l=0,r=1e9;
		while(l<r){
			int mid=(l+r)/2;
			if((k-1)*mid>sum) r=mid;
			else l=mid+1;
		}
		if(b<=l){
			cout<<"NO"<<endl;
			return;
		}
		sum+=l;
		b-=l;
	}
	if(b*k>a) cout<<"YES"<<endl;
	else cout<<"NO"<<endl;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t=1;
    cin>>t;
	while(t--) {
		solve();
	}
	return 0;
}

 

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值