A. United We Stand
题意要求其中一个数组不能出现被除数的关系,那么只需要把最小的数放在p数组,其他的数放在q数组就可以了,如果q数组是空的则输出-1
#include<iostream>
#include<vector>
#include<algorithm>
#define int long long
using namespace std;
signed main()
{
int T;
cin>>T;
int a[200];
while(T--)
{
int n;cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
vector<int>p;
vector<int>q;
sort(a+1,a+1+n);
p.push_back(a[1]);
for(int i=2;i<=n;i++)
{
if(a[i]==a[1]) p.push_back(a[i]);
else q.push_back(a[i]);
}
if(q.empty()) {
cout<<"-1"<<endl;
continue;
}
cout<<p.size()<<" "<<q.size()<<endl;
while(!p.empty())cout<<p.back()<<" ",p.pop_back();cout<<endl;
while(!q.empty())cout<<q.back()<<" ",q.pop_back();cout<<endl;
}
}
B. Olya and Game with Arrays
例如样例3
排序后取出最小和次小
5 7
6 8
2 9
移动所有最小的到次小最小的数组
2 6 5 7
8
9
答案就是2+8+9
在原数组中的位置
5 7
6 *8
*2 *9
也就是所有次小数数组元素相加减去次小数数组最小的加上最小数数组的最小数
代码表示为:
for(auto x:smin) ans+=x;
ans-=smin.front();
ans+=mmin.front();
#include<iostream>
#include<vector>
#include<algorithm>
#define int long long
const int MAXN=1e6+5;
int a[MAXN];
using namespace std;
signed main() {
int T;
cin>>T;
while(T--) {
int N;
cin>>N;
vector<int>mmin;
vector<int>smin;//second min
for(int i=1; i<=N; i++) {
int n;
cin>>n;
for(int i=0; i<n; i++) cin>>a[i];
sort(a,a+n);
mmin.push_back(a[0]);
smin.push_back(a[1]);
}
sort(smin.begin(),smin.end());
sort(mmin.begin(),mmin.end());
int ans=0;
for(auto x:smin) {
ans+=x;
}
ans-=smin.front();
ans+=mmin.front();
cout<<ans<<endl;
}
}
C. Another Permutation Problem
需要先打表找规律
发现这些可行的数列的排列都是后一半是倒序的。
那么遍历所有情况,后k位数reverse,计算最大值。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int T;cin>>T;
while(T--)
{
int n;
cin>>n;
int a[n+1];
for(int i=1;i<=n;i++)
{
a[i]=i;
}
int aans=0;
for(int i=0;i<=n;i++)
{
int ans=0,maxx=0;
reverse(a+1+i,a+1+n);
for(int i=1;i<=n;i++)
{
maxx=max(a[i]*i,maxx);
ans+=a[i]*i;
}
aans=max(aans,ans-maxx);
maxx=0;
reverse(a+1+i,a+1+n);
}
cout<<aans<<endl;
}
}