1 条题解

  • 0
    @ 2025-8-24 22:53:12

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar xyx404
    发接龙拉黑 | 新初三|蒟蒻| Link3 聚合页 link3.cc/xyx404 | 个人博客链接 xyx404.github.io

    搬运于2025-08-24 22:53:12,当前版本为作者最后更新于2023-12-30 16:08:29,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目

    思路:

    因为题中给出要使奇数组的编号之和为偶数偶数组的编号之和为奇数

    所以我们只需要知道编号的奇偶性

    所以我们可以先统计出奇数和偶数各有多少个。

    然后会出现两种情况:奇数多,偶数多。

    因为小学学过:奇数加奇数等于偶数,偶数加偶数等于偶数,奇数加偶数等于奇数。

    所以可以得出解决方案:

    1. 奇数多时,将两个奇数相加变成偶数,减少奇数的数量,增加偶数的数量。
    2. 偶数多时,将偶数和奇数相加变成奇数,减少偶数的数量,增加奇数的数量。

    代码

    #include <bits/stdc++.h> // 头文件
    using namespace std;
    bool jo (int x) { // 判断是奇数还是偶数函数
    	if ( x % 2 == 0) return 1; // 是偶数返回真
    	return 0; // 不是就返回假
    }
    int main() { // 主函数
    	int n , j = 0 , k = 0; // j 为偶数的数量 k 为奇数的数量
    	cin >> n; // 输入 n
    	int a[n];
    	for(int i = 0; i < n; i++){
    		cin >> a[i]; // 输入
    	}
    	for(int i = 0; i < n ; i++){ // 判断奇数还是偶数
    		if (jo(a[i])) j++; // 是偶数 j++
    		else k++; // 不是偶数 k++
    	}
    	while(k > j){ // 第一种情况奇数多
    		k -= 2; // 两个奇数相加等于偶数所以奇数每次减 2
    		j++; // 偶数加 1
    	}
    	if(j > k+1) j=k+1; // 第二种情况偶数多
    	cout << k+j; // 输出答案
      	return 0; // 好习惯
    }
    
    • 1

    信息

    ID
    9515
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者