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