2020小学甲组--好数组

博客给出一个算法题,需判断包含n个正整数的数组是“好数组”还是“坏数组”。先将数组从小到大排序,若相邻两数差超1则为“坏数组”,否则为“好数组”。还给出输入输出格式及示例,要求根据输入输出对应结果。

题目描述

给出一个包含n个元素的数组a[1..n],数组的每一个元素都是正整数。现在首先把a数组从小到大排序,然后观察a数组所有的相邻的两个数,如果存在相邻的两个数的差超过1,那么a数组就是“坏数组”,否则是“好数组”。如果是“好数组”输出“YES”,否则输出“NO”。

输入格式

多组测试数据。

第一行,一个整数T,表示有T组测试数据。1<=T<=1000。

每组测试数据格式如下:

第一行,一个整数n。 1<=n<=50。

第二行,n个整数,第i个整数是a[i],其中1<=a[i]<=100。

输出格式

共T行,每行一个字符串,"YES"或者"NO"

输入/输出例子1

输入:

5

3

2 1 2

4

5 5 5 5

3

4 1 2

4

4 4 1 3

1

100

输出:

YES

YES

NO

NO

YES

提交测评:

#include<bits/stdc++.h>
using namespace std;
int n,m,a[1005],f;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>m;
        for(int j=1;j<=m;j++)cin>>a[j];        
        sort(a+1,a+m+1);
        f=0;
        for(int j=1;j<m;j++)if(a[j+1]-a[j]>1) f=1;                       		 
        if(f==1)cout<<"NO"<<endl;
        else cout<<"YES"<<endl;
    }    
    return 0;
}
<think>题目要求:甲组17人,乙有25人,从甲组抽调部分学生去乙后,乙人数是甲组人数的2倍。求抽调人数。 设抽调人数为x,则抽调后: 甲组人数 = 17 - x 乙人数 = 25 + x 根据条件:乙人数是甲组人数的2倍,得到方程: 25 + x = 2 * (17 - x) 解方程: 25 + x = 34 - 2x x + 2x = 34 - 25 3x = 9 x = 3 因此,抽调了3人。 由于题目要求用C++程序,且输入无,输出为抽调人数(3)。 我们可以直接输出3,但为了清晰,我们可以通过计算来输出。 但是,题目没有输入,所以我们可以直接输出答案3。不过,为了展示计算过程,我们可以写一个简单的程序解方程。 程序思路: 设x为抽调人数(x从0开始,最大不超过17) 循环x从0到17,判断是否满足:25+x == 2*(17-x) 找到满足条件的x,输出即可。 由于我们已经知道答案是3,也可以直接输出3。但为了通用性,我们使用循环来求解。 注意:题目保证有解,所以循环内一定会找到解。 代码:</think>以下是解决植树分问题的C++代码,包含详细注释说明每一步逻辑: ```cpp #include <iostream> using namespace std; int main() { // 问题分析: // 已知: // - 甲组初始人数: 17人 // -初始人数: 25人 // - 抽调后乙人数 = 2 × 甲组人数 // 未知: // -甲组抽调的人数x // 建立方程: // 抽调后: // 甲组人数 = 17 - x // 乙人数 = 25 + x // 关系式: // 25 + x = 2 × (17 - x) // 解方程步骤: // 1. 25 + x = 34 - 2x // 2. x + 2x = 34 - 25 // 3. 3x = 9 // 4. x = 3 // 直接输出计算结果 cout << 3; return 0; } ``` ### 数学推导详细说明: 1. **定义变量**: - 设从甲组抽调的人数为 `x` - 抽调后: - 甲组剩余人数:`17 - x` -增加后人数:`25 + x` 2. **建立方程**: ``` 乙人数 = 2 × 甲组人数 => 25 + x = 2 × (17 - x) ``` 3. **解方程过程**: ``` 25 + x = 2 × (17 - x) 25 + x = 34 - 2x // 展开右侧 x + 2x = 34 - 25 // 移项(x项左移,常数右移) 3x = 9 // 合并同类项 x = 3 // 两边除以3 ``` ### 通用解法代码: 如果问题参数可能变化,可以使用以下通用解法: ```cpp #include <iostream> using namespace std; int main() { // 定义初始参数 const int groupA = 17; // 甲组初始人数 const int groupB = 25; // 乙初始人数 const int multiplier = 2; // 乙甲组的倍数 // 解方程:groupB + x = multiplier * (groupA - x) // 推导:groupB + x = multiplier*groupA - multiplier*x // x + multiplier*x = multiplier*groupA - groupB // x*(1 + multiplier) = multiplier*groupA - groupB // x = (multiplier*groupA - groupB) / (1 + multiplier) int x = (multiplier * groupA - groupB) / (1 + multiplier); // 验证结果有效性 if (x < 0 || x > groupA) { cout << "无有效解"; } else { // 输出抽调人数 cout << x; } return 0; } ``` ### 通用代码说明: 1. **数学推导**: ``` x = (2×17 - 25) / (1+2) = (34-25)/3 = 9/3 = 3 ``` 2. **验证条件**: - `x < 0`:抽调人数不能为负 - `x > groupA`:抽调人数不能超过甲组原有人数 - 方程解必须为整数(题目隐含条件) 3. **执行流程**: - 定义初始参数 - 通过数学公式直接计算解 - 验证解的合理性 - 输出结果 ### 示例验证: 初始状态: - 甲组17人 -:25人 抽调3人后: - 甲组17-3=14人 -:25+3=28人 验证:28 =14,满足条件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值