给定一个长度为 n 的数组 a。
每次操作可以选择任意的下标 i,j(1≤i,j≤n),同时进行如下变换:
目标是使整个数组中的元素全部变成偶数。求最少需要的操作次数;若始终无法全部变为偶数,则输出 −1。
#include <iostream>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
// 读取数组长度 n
cin >> n;
int cntOdd = 0;
bool hasEven = false;
for (int i = 0; i < n; i++){
int a;
// 读取数组中的元素 a
cin >> a;
// 判断 a 是否为偶数
if(a % 2 == 0){
hasEven = true;
} else {
cntOdd++; // 累计奇数个数
}
}
// 若不存在偶数,则无法将所有数变为偶数
if(!hasEven){
cout << -1 << "\n";
} else {
// 答案即为奇数的个数
cout << cntOdd << "\n";
}
return 0;
}
# 读取数组长度 n
n = int(input())
# 读取数组 a,使用 map 转换为整数列表
a = list(map(int, input().split()))
cnt_odd = 0 # 奇数计数
has_even = False # 是否存在偶数
# 遍历数组 a
for num in a:
# 判断是否为偶数
if num % 2 == 0:
has_even = True
else:
cnt_odd += 1 # 奇数计数加一
# 如果没有偶数,则输出-1
if not has_even:
print(-1)
else:
# 否则输出奇数的个数
print(cnt_odd)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 读取数组长度n
int n = sc.nextInt();
int cntOdd = 0; // 奇数计数
boolean hasEven = false; // 是否存在偶数
// 遍历数组中的每个元素
for (int i = 0; i < n; i++) {
int a = sc.nextInt();
// 判断a是否为偶数
if (a % 2 == 0) {
hasEven = true;
} else {
cntOdd++; // 奇数计数加一
}
}
// 如果数组中没有偶数,则输出-1
if (!hasEven) {
System.out.println(-1);
} else {
// 否则输出奇数的个数
System.out.println(cntOdd);
}
sc.close();
}
}
小红有一个长度为n的数组a。
她每次可以选定任意的i,j(1≤i,j≤n),然后将ai→ai×aj,
aj→lcm(ai,aj),两个操作是同时进行的,没有先后顺序。
小红想知道,把整个数组变成全部都是偶数元素的最少操作次数,若始终无法全变成偶数,输出−1。
第一行输入一个正整数n(1≤n≤105),表示数组a的长度。
第二行输入n个正整数,表示数组a,其中1≤ai≤109
输出一个整数,表示把整个数组变成全部都是偶数元素的最少操作次数,若始终无法全变成偶数,输出−1。
输入
2
1 2
输出
1
输入
2
1 1
输出
-1