Educational Codeforces Round 100 (Rated for Div. 2) B. Find The Array(思维)
https://codeforces.com/contest/1463/problem/B
题目大意:
给定n个数字的数组a,让我们凑出数组b;
满足b[i]要么可以整除b[i+1],要么可以被b[i+1]整除,同时2*求和abs(a[i]-b[i])[1,n]<=sum(a[1]+,,,+a[n])。
表示这样的b数组是一定存在的,让我们构造出这样的b数组出来。
input
4
5
1 2 3 4 5
2
4 6
2
1 1000000000
6
3 4 8 1 2 3
output
3 3 3 3 3
3 6
1 1000000000
4 4 8 1 3 3
难怪评分1400,半天不知道怎么构造
看了下题解,果然奇妙
- 先计数,求奇数总和以及偶数总和
- 奇数总和 > 偶数总和时,保留下标为奇数时候的数据,偶数下标数据通通改为1;
相反,偶数下标数据保留,奇数下标数据改为1。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=200200,M=2002;
LL a[N];
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
cin>>T;
while(T--)
{
LL n;
cin>>n;
LL ji=0,ou=0;
for(LL i=1;i<=n;i++)
{
cin>>a[i];
if(i%2==1) ji+=a[i];
else ou+=a[i];
}
if(ji>ou)
{
for(LL i=1;i<=n;i++)
{
if(i%2==1) cout<<a[i]<<" ";
else cout<<"1"<<" ";
}
}
else
{
for(LL i=1;i<=n;i++)
{
if(i%2==0) cout<<a[i]<<" ";
else cout<<"1"<<" ";
}
}
cout<<endl;
}
return 0;
}