think-cell Round 1

A. Maximise The Score

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=55;
int a[2*N];
int n;
void solve() {
	cin>>n;
	for(int i=1;i<=2*n;i++) cin>>a[i];
	sort(a+1,a+1+2*n);
	int ans=0;
	for(int i=1;i<=2*n;i++){
		if(i%2) ans+=a[i];
	}
	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;
}

B. Permutation Printing

构造一个全排列,使得对于任何 a i a_i ai% a j a_j aj==0, a i + 1 a_{i+1} ai+1% a j + 1 a_{j+1} aj+1!=0

整除想到前后大小关系,大的肯定不能整除小的,所以一大一小,一大一小排列

构造一个数组满足某种性质,关键还是在于那个性质,应该重点研究那个性质
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
int n;
void solve() {
	cin>>n;
	if(n==3){
		cout<<1<<' '<<2<<' '<<3<<endl;
		return;
	}
	if(n==4){
		cout<<4<<' '<<1<<' '<<2<<' '<<3<<endl;
		return;
	}
	for(int i=1,j=n;i<=j;i++,j--){
		if(i==j) cout<<i<<' ';
		else cout<<i<<' '<<j<<' ';
	}
	cout<<endl;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t=1;
    cin>>t;
	while(t--) {
		solve();
	}
	return 0;
}

C. Lexicographically Largest

我们选取数放到set里面,set会自动降序,然后求字典序最大的

如果是multiset的话,我们就直接全部放进去就可以了,但是set会去重,所以对于相同的,就算减小也不要让它被去重了

我们可以发现对于5 5 4 2(已经是 a i a_i ai+i了),如果我们操作第一个元素,那么变成5,4,3,1但是我们肯定想要5,4,3,2,可以先操作第4个元素,再操作第一个元素,就可以得到了,然和对原序列换一下顺序 ,变成4 2 5 5,可以先操作第四个元素,再操作第二个元素,再操作第一个元素,这样也可以得到5,4,3,2,

所以不管怎样,答案就是先降序,然后依次枚举,如果前面有的话,那么当前就减1

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值