|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
Calabash面临一个难题,快来帮帮他。给定一个个数为n的数组,a1,a2,…,an ,当数组中两项ai,aj满足
|i−j|=1,可以交换这两项。那么最少需要交换多少次,可以使任意相邻的两项奇偶性不同?
输入
包含多组测试样例。
第一行,为样例数t(1≤t≤104)。
每组测试样例第一行,为数组中项的个数n,接下来一行是数组a1,a2,…,an(1≤ai≤109)。
所有t组输入数据的a数组长度之和不超过105。
输出
对每组样例输出最少的交换次数,如果任意次数的交换都不能满足条件输出-1。
样例输入 Copy
5
3
6 6 1
1
9
6
1 1 1 2 2 2
2
8 6
6
6 2 3 4 5 1
样例输出 Copy
1
0
3
-1
2
我的代码如下,不知道哪里有问题
#include<stdio.h>
int main()
{
int m,n,t,f[100000],i,x,w,a,b,jishu;
scanf("%d",&m);
for(t=0; t<m; t++)
{
x=0;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d",&f[i]);
if(f[i]%2==0)
{
f[i]=0;
x++;
}
else
{
f[i]=1;
jishu++;
}
}
if(x<(n/2)||x>((n+1)/2))
{
printf("-1\n");
continue;
}
if(n%2==0)
{
for(i=0,w=1,a=0; i<n; i++)
{
if(f[i]==1)
{
if(i+1>w)a+=i+1-w;
else a+=w-i-1;
w=w+2;
}
}
for(i=0,w=2,b=0; i<n; i++)
{
if(f[i]==1)
{
if(i+1>w)b+=i+1-w;
else b+=w-i-1;
w=w+2;
}
}
if(a>b)printf("%d\n",b);
else printf("%d\n",a);
}
else
{
if(jishu==(n/2))
{
for(i=0,w=2,a=0; i<n; i++)
{
if(f[i]==1)
{
if(i+1>w)a+=i+1-w;
else a+=w-i-1;
w=w+2;
}
}
printf("%d\n",a);
}
else
{
for(i=0,w=1,a=0; i<n; i++)
{
if(f[i]==1)
{
if(i+1>w)a+=i+1-w;
else a+=w-i-1;
w=w+2;
}
}
printf("%d\n",a);
}
}
}
return 0;
}
本帖最后由 jackz007 于 2022-10-15 02:37 编辑
- #include <stdio.h>
- int main(void)
- {
- int a , b , c , d[110][110] , i , j , k , p , q , r , t , x ;
- scanf("%d" , & t) ;
- for(i = 0 ; i < t ; i ++) {
- scanf("%d" , & d[i][0]) ;
- for(j = 0 ; j < d[i][0] ; j ++) scanf("%d" , & d[i][j + 1]) ;
- }
- for(i = 0 ; i < t ; i ++) {
- for(a = b = j = 0 ; j < d[i][0] ; j ++) {
- if(d[i][j + 1] % 2) a ++ ;
- else b ++ ;
- }
- for(c = j = 0 ; j < d[i][0] ; j += 2) if(d[i][j + 1] % 2) c ++ ;
- if(a > b && a - b < 2 || a < b && b - a < 2 || a == b) {
- p = 0 ;
- q = 1 ;
- if(a < b || (a == b && 2 * c < a)) {
- p = 1 ;
- q = 0 ;
- }
- for(r = 0 ;;) {
- for(j = p ; j < d[i][0] && d[i][j + 1] % 2 ; j += 2) ;
- for(k = q ; k < d[i][0] && ! (d[i][k + 1] % 2) ; k += 2) ;
- if(j < d[i][0] && k < d[i][0]) {
- x = d[i][j + 1] ;
- d[i][j + 1] = d[i][k + 1] ;
- d[i][k + 1] = x ;
- r ++ ;
- } else {
- break ;
- }
- }
- printf("%2d : %d" , r , d[i][1]) ;
- for(j = 1 ; j < d[i][0] ; j ++) printf(",%d" , d[i][j + 1]) ;
- printf("\n") ;
- } else {
- printf("-1 :\n") ;
- }
- }
- }
复制代码
编译、运行实况:
- D:\[00.Exerciese.2022]\C>g++ -o x x.c
- D:\[00.Exerciese.2022]\C>x
- 5
- 3
- 6 6 1
- 1
- 9
- 6
- 1 1 1 2 2 2
- 2
- 8 6
- 6
- 6 2 3 4 5 1
- 1 : 6,1,6
- 0 : 9
- 1 : 1,2,1,2,1,2
- -1 :
- 1 : 1,2,3,4,5,6
- D:\[00.Exerciese.2022]\C>
复制代码
这个结果和样例给出的答案有出入,特别是第 3 、5 组,第 3 组只要交换索引 1、4 的元素即可,只需要 1 次交换,第 5 组数据只要交换索引 0、5 的元素即可,也只要交换一次,从而,与样例答案有所不同,不知道这个理解是否正确。
|
|