Codeforces Round #650 (Div. 3) 参与排名人数11978
[codeforces 1367B] Even Array 统计余数情况
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址http://codeforces.com/contest/1367/problem/B
此篇文章晚写原因,Codeforces网站2020.6.17一直无法访问,直到下午某个时刻才能访问。
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
B - Even Array | GNU C++17 | Accepted | 15 ms | 0 KB |
题目大意:给定数组a,任意位置i对应的元素值是a[i],若满足任意的i%2==a[i]%2,那么这个数组是个好数组。给定一个数组,若能通过交换数组中的元素变成好数组,输出最小交换次数,若不能,输出-1.
基本思路:统计a[i]%2==1对应的个数,统计i%2==1对应的个数,若两者相等,可以变成好数组,反之,则不行。
在上述数量相等的基础上,统计i%2!=a[i]%2的个数cnt,cnt/2即为最小交换次数。
AC代码如下
#include <stdio.h>
#define maxn 50
int a[maxn];
void solve(){
int i,n,cnt=0,cnt0=0,cnt1=0,cnt00=0,cnt11=0;
scanf("%d",&n);
for(i=0;i<n;i++)scanf("%d",&a[i]),a[i]%=2;
for(i=0;i<n;i++)
if(a[i])cnt1++;
else cnt0++;
for(i=0;i<n;i++)
if(i%2)cnt11++;
else cnt00++;
if(cnt1!=cnt11){printf("-1\n");return;}
for(i=0;i<n;i++)
if(i%2!=a[i])cnt++;
printf("%d\n",cnt/2);
}
int main(){
int t;
scanf("%d",&t);
while(t--)solve();
return 0;
}