hdu 5143 NPY and arithmetic progression(暴力枚举)

本文提供了一道HDU OJ题目5143的解题思路及C++代码实现。该题要求判断给定的数字序列是否能通过组合形成有效的等差数列,并确保所有数字被恰好使用一次。

http://acm.hdu.edu.cn/showproblem.php?pid=5143

 

题意 : 有一定数量的 1 2 3 4 

          要求每三个或以上数字组成等差数列 每个数字用一次

          问是否能把数字都用完

 

思路: 等差数列的可能有 1 2 3  ,  2 3 4 ,1 2 3 4, 或者三个或以上的常数列

         如果前三种数列有三个以上就能组成常数列

         所以我们从0到2 枚举 只要剩下的数字全都 等于0 或者大于等于3 就能满足条件

         (想到就能轻松解决 可惜每次都要看题解才知道怎么搞= =)

 

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;

bool ok(int a[])
{
    if((a[0]==0||a[0]>=3)&&(a[1]==0||a[1]>=3)&&(a[2]==0||a[2]>=3)&&(a[3]==0||a[3]>=3))
        return true;
    return false;
}
int main()
{
    int a[10],b[10];
    int n;
    int i,j,k;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d%d%d%d",&a[0],&a[1],&a[2],&a[3]);
        if(ok(a)) printf("Yes\n");
        else
        {
            int ok1=0;
            for(i=0;i<=2;i++)
            {
                for(j=0;j<=2;j++)
                {
                    for(k=0;k<=2;k++)
                    {
                        b[0]=a[0]-i-j;
                        b[1]=a[1]-i-j-k;
                        b[2]=a[2]-i-j-k;
                        b[3]=a[3]-i-k;
                        if(ok(b)) ok1=1;
                    }
                }
            }
            if(ok1) printf("Yes\n");
            else printf("No\n");
        }
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/sola1994/p/4249521.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值