4-adjacent(AtCoder-2686)

本文介绍了一道竞赛编程题目,要求判断一组正整数是否可通过任意次交换,使每相邻两数的乘积为4的倍数。通过统计特定数的个数,解决这一问题。
摘要由CSDN通过智能技术生成

Problem Description

We have a sequence of length N, a=(a1,a2,…,aN). Each ai is a positive integer.

Snuke's objective is to permute the element in a so that the following condition is satisfied:

For each 1≤i≤N−1, the product of ai and ai+1 is a multiple of 4.
Determine whether Snuke can achieve his objective.

Constraints

  • 2≤N≤105
  • ai is an integer.
  • 1≤ai≤109

Input

Input is given from Standard Input in the following format:

N
a1 a2 … aN

Output

If Snuke can achieve his objective, print Yes; otherwise, print No.

Example

Sample Input 1

3
1 10 100

Sample Output 1

Yes
One solution is (1,100,10).

Sample Input 2

4
1 2 3 4

Sample Output 2

No
It is impossible to permute a so that the condition is satisfied.

Sample Input 3

3
1 4 1

Sample Output 3

Yes
The condition is already satisfied initially.

Sample Input 4

2
1 1

Sample Output 4

No

Sample Input 5

6
2 7 1 8 2 8

Sample Output 5

Yes

题意:给出 n 个数,问经过任意次交换后,使得每个数乘以他的左边是 4 的倍数,乘以右边也是 4 的倍数,若能成功输出 Yes,若不能输出 No

思路:

由于每个数乘以相邻的数是 4 的倍数,那么说明其中一个数是 4 的倍数,或者两个数都是 2 的倍数

因此,直接统计这 n 个数中为 2、4 的倍数的数的个数,考虑每个位置插 2 插 4 的关系即可

Source Program

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 1E9+7;
const int N = 200000+5;
const int dx[] = {-1,1,0,0,-1,-1,1,1};
const int dy[] = {0,0,-1,1,-1,1,-1,1};
using namespace std;
int a[N];
int main() {
    int n;
    scanf("%d",&n);

    int num4=0,num2=0;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(a[i]%4==0)
            num4++;
        else if(a[i]%2==0)
            num2++;
    }
    if(n>2*num4+num2+1)
       printf("No\n");
    else if(2*num4+num2+1==n&&num2!=0)
        printf("No\n");
    else
        printf("Yes\n");

    return 0;
}

 

### 删除相邻重复项时 `SY-SUBRC` 的使用 在 ABAP 中,`DELETE ADJACENT DUPLICATES FROM` 是一种用于从内部表中删除连续相同记录的操作语句。执行此操作后,系统会自动设置系统字段 `SY-SUBRC` 来指示操作的结果状态。 #### 关于 `SY-SUBRC` - 当成功完成删除操作时,`SY-SUBRC` 将被设置为 0 表明没有任何错误发生[^1]。 - 如果未找到任何可以删除的相邻重复项,则 `SY-SUBRC` 同样会被设为 0,因为这并不算作是一个错误情况[^2]。 以下是具体的例子展示如何利用该命令以及处理可能遇到的问题: ```abap DATA: itab TYPE TABLE OF string, wa TYPE string. "填充数据到内表itab APPEND 'A' TO itab. APPEND 'B' TO itab. APPEND 'B' TO itab. "这里有两个相同的'B' APPEND 'C' TO itab. APPEND 'D' TO itab. APPEND 'D' TO itab. "这里有另一个重复'D' WRITE / 'Before deleting duplicates:'. LOOP AT itab INTO wa. WRITE / wa. ENDLOOP. "调用删除相邻重复项函数并检查返回码 DELETE ADJACENT DUPLICATES FROM itab. IF sy-subrc EQ 0. WRITE / 'Deletion successful.'. ELSE. WRITE / 'An error occurred during deletion.'. ENDIF. WRITE / 'After deleting duplicates:'. LOOP AT itab INTO wa. WRITE / wa. ENDLOOP. ``` 上述代码片段展示了如何向一个字符串类型的简单标准表插入一些具有潜在重复性的条目,随后通过 `DELETE ADJACENT DUPLICATES FROM` 命令去除这些连续出现两次以上的项目,并验证其后的 `SY-SUBRC` 是否正常反映预期的行为。 #### 故障排除指南 如果发现程序运行结果不符合期望或者遇到了异常状况,可以从以下几个方面入手排查问题: 1. **确认输入表格结构**: 确保所使用的内部表确实含有能够形成“邻接”的元素集合;否则即使语法正确也可能得不到理想效果。 2. **理解逻辑定义差异**: 注意区分 “adjacent(即紧挨着彼此) 和其他形式的数据冗余概念之间的区别,在某些场景下仅移除真正意义上的邻居副本才是必要的行为模式之一. 3. **调试工具的应用**: 使用ABAP Debugger逐步跟踪每一步骤的变化过程可以帮助定位具体哪个环节出了差错。 4. **考虑边界条件测试**: 对极端案例比如空列表或是完全由单一值构成的大规模数组做额外检验来增强解决方案鲁棒性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值