A. United We Stand
思路:很容易想到让数组里面的最小值放在b数组里让其余的放在c数组里即可。
注意:如果最小值存在多个将这些数都放在b数组里并且保证c数组要有值
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+7;
int n,k,t;
typedef pair<int,int>pii;
vector<pii>q;
map<int,int>mp;
int a[N],b[N];
string S[N];
void solve(){
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
sort(a,a+n);
int x=a[0];
for(int i=1;i<n;i++)
if(x%a[i]==0&&a[i]!=x){
cout<<"-1"<<endl;
return ;
}
int id=0;
while(x==a[id]){
id++;
}
if(id==n){
cout<<"-1"<<endl;
return ;
}
cout<<id<<" "<<n-id<<endl;
for(int i=0;i<id;i++)cout<<a[i]<<" ";
cout<<endl;
for(int i=id;i<n;i++)cout<<a[i]<<" ";
cout<<endl;
}
signed main(){
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
cin>>t;
while(t--)solve();
}
B. Olya and Game with Arrays
思路:首先我们可以发现如果一个数组交换来一个比最小值大的值过来是不会改变一个数组的完美度的,但是怎样能让最终值最大呢,这时我们能想到跟最小值和次小值有关,因为一个数组如果拿走的是最小值,最终值就会变成次小值,所以我们可以将其他数组最小值找到最终放在次小值里面最小的那个数组中,其他最小值也放在里面,就能保证次小值都能被取到。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+7;
int n,k,t,m;
typedef pair<int,int>pii;
vector<pii>q;
map<int,int>mp;
int a[N],b[N];
string S[N];
void solve(){
cin>>n;
int mi=2e9;
for(int i=0;i<n;i++){
cin>>m;
int m1=2e9,m2=2e9;
for(int i=0;i<m;i++){
cin>>a[i];
}
for(int i=0;i<m;i++){
m1=min(m1,a[i]);
}
mi=min(m1,mi);
int f=0;
for(int i=0;i<m;i++){
if(a[i]==m1&&f==0){
f=1;
continue;
}
m2=min(m2,a[i]);
}
b[i]=m2;
}
sort(b,b+n);
int num=mi;
for(int i=1;i<n;i++)num+=b[i];
cout<<num<<endl;
}
signed main(){
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
cin>>t;
while(t--)solve();
}
C. Another Permutation Problem
思路:这个题其实很简单,一开始想到深搜去了,浪费时间了
这题先打个表很容易发现,想让最终值最大,应该是前面正序 ,后面反序,所以直接遍历找就行
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+7;
int n,k,t,m;
typedef pair<int,int>pii;
vector<pii>q;
map<int,int>mp;
int a[N],b[N],p[N];
string S[N];
void solve(){
cin>>n;
if(n==2){
cout<<n<<endl;
return ;
}
for(int i=1;i<=n;i++)a[i]=i;
int mx=-1e18;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++)b[j]=a[j];
int id=n;
for(int j=i+1;j<=n;j++)b[j]=a[id--];
int mi=-1e18,sum=0;
for(int j=1;j<=n;j++){
sum+=(j*b[j]);
mi=max(mi,j*b[j]);
}
mx=max(mx,sum-mi);
}
cout<<mx<<endl;
}
signed main(){
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
cin>>t;
while(t--)solve();
}
后续待跟新 @_@ 太菜了