CodeForces - 839B Game of the Rows

本文介绍了一个关于如何在有限的飞机座位中安排不同队伍士兵的问题。通过三次循环分配四个座位、两个座位和一个座位的方式,确保来自不同队伍的士兵不会坐在相邻的座位上。最终判断是否能成功安排所有士兵。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

B. Game of the Rows
time limit per test
 1 second
memory limit per test
 256 megabytes
input
 standard input
output
 standard output

Daenerys Targaryen has an army consisting of k groups of soldiers, the i-th group contains ai soldiers. She wants to bring her army to the other side of the sea to get the Iron Throne. She has recently bought an airplane to carry her army through the sea. The airplane hasn rows, each of them has 8 seats. We call two seats neighbor, if they are in the same row and in seats {1, 2}{3, 4}{4, 5}{5, 6} or{7, 8}.

A row in the airplane

Daenerys Targaryen wants to place her army in the plane so that there are no two soldiers from different groups sitting on neighboring seats.

Your task is to determine if there is a possible arranging of her army in the airplane such that the condition above is satisfied.

Input

The first line contains two integers n and k (1 ≤ n ≤ 100001 ≤ k ≤ 100) — the number of rows and the number of groups of soldiers, respectively.

The second line contains k integers a1, a2, a3, ..., ak (1 ≤ ai ≤ 10000), where ai denotes the number of soldiers in the i-th group.

It is guaranteed that a1 + a2 + ... + ak ≤ 8·n.

Output

If we can place the soldiers in the airplane print "YES" (without quotes). Otherwise print "NO" (without quotes).

You can choose the case (lower or upper) for each letter arbitrary.



解题思路

先装四个座位,再装2个座位,最后装一个座位

循环三次 依次减去座位数

1.第一次循环 减去每个队需要的4个座位的行数 如果够减就减 如果不够减就不减 sum1=n为4个座位的行数n,d=min(sum1,a[i]/4)

那么a[i]的值减少了4*d个,sum1的值就减少了d个 不够减就是说sum1<a[i]/4,那么sum1有几个就减几个

2.第二次循环 sum2=n*2+sum1 减去每个队需要的2个座位的行数 如果够减就减 如果不够就不减  知道最后一个

3.第三次循环 temp=sum2+sum1,因为如果四个座位坐两个的话 那么还有两个座位是可以坐一个人的所以还要加上一个sum1,然后temp=temp-a[i];a[i]的值就表示它需要多少行

最后看temp是否>=0 是就能坐满 不是就不能

#include <iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int a[105];
int main()
{
    //freopen("E:\\file.txt","r",stdin);
    int n,k;
    cin>>n>>k;
    for(int i=0;i<k;i++)
       cin>>a[i];
    int sum1=n,sum2=n*2;
    for(int i=0;i<k;i++)
    {
        int d=min(sum1,a[i]/4);
        a[i]=a[i]-d*4;
        sum1=sum1-d;
    }
    sum2=sum1+sum2;
    for(int i=0;i<k;i++)
    {
        int d=min(sum2,a[i]/2);
        a[i]=a[i]-d*2;
        sum2=sum2-d;
    }
    int temp=sum1+sum2;
    for(int i=0;i<k;i++)
    {
        temp=temp-a[i];
    }
    if(temp>=0)
        cout<<"YES"<<endl;
    else
        cout<<"NO"<<endl;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值