牛客网Wannafly挑战赛15 B车辆安排(模拟)AND C 出队(规律)

传送门 :B题:点我

    C题: 点我

题目描述

有n个队伍,每个队伍的人数小于等于5,每辆车最多坐5个人,要求一个队伍的人都在一辆车上,求最少的车数

输入描述:

第一行n
第二行n个数,表示每个队伍的人数

输出描述:

输出最少车数

示例1

输入

3
3 4 5

输出

3

备注:

n≤1e5每个数小于等于5


思路:大力模拟。5自己一车,4跟1一车,然后3跟2一车,2的时候分情况考虑,如果2是偶数,那么2+2+1或者2+2,如果2是奇数,那么分成偶数+1,最后一个2,可以2+1+1+1,或者2+1+1或者2+1或者2,最后处理1
代码:(因为太长了就折叠了,然后最后附上了一些测试数据)
#include <cstdio>  
#include <cstring>  
#include <cmath>  
#include <cstdlib>  
#include <ctime>  
#include <iostream>  
#include <algorithm>  
#include <sstream>  
#include <string>  
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>  
#include <utility>
#include <bitset>

using namespace std;  
#define LL long long  
#define pb push_back  
#define mk make_pair  
#define pill pair<int, int>  
#define mst(a, b)    memset(a, b, sizeof a)  
#define REP(i, x, n)    for(int i = x; i <= n; ++i)
int main(){
    int n;
    scanf("%d",&n);
    int a[6] = {};
    for(int i = 0 ; i < n ; i++){
        int x;
        scanf("%d",&x);
        a[x]++;
    }
    int sum = a[5];
    if(a[1] >= a[4]){
        sum += a[4];
        a[1] -= a[4];
    }
    else{
        sum += a[4];
        a[1] = 0;
    }
    if(a[2] >= a[3]){
        sum += a[3];
        a[2] -= a[3];
    }//如果2 比 3多 
    else{
        sum += a[2];
        a[3] -= a[2];
        a[2] = 0;
        int t = 2 * a[3];//a[3]可以带走多少a[1]
        if(a[1] >= t){
            sum += a[3];
            a[1] -= t;
        }
        else{
            sum += a[3];
            a[1] = 0;
        }
    }
    if(a[2] >= 0){
        int d1,d2;
        if(a[2] % 2 == 0){
            d1 = a[2] / 2;
            if(a[1] >= d1){
                sum += d1;
                a[1] -= d1;
            }
            else{
                sum += d1;
                a[1] = 0;
            }

        }
        else{
            d1 = a[2] / 2;
            d2 = 1;
            sum += 1;//无论怎么样多出来这一个2肯定要一辆车
            if(a[1] >= d1){
                sum += d1;
                a[1] -= d1;
            }
            else{
                sum += d1;
                a[1] = 0;
            }
            if(a[1] >= 3){
                a[1] -= 3;
            }
            else{
                a[1] = 0;
            }
        }
    }
    if(a[1] != 0){
        sum += (a[1]%5 == 0 ? a[1]/5 : a[1]/5 + 1);
    }
    printf("%d\n",sum);
}
/*
9
1 1 2 2 2 3 3 3 4
5


4
1 1 1 1
1


6
1 2 3 4 5 2
4

7
2 2 2 2 1 1 1
3

6
2 2 2 2 1 1
2

7
1 2 2 2 2 2 3
3

5
4 4 4 4 1
4


5
4 4 4 2 1
4

6
4 4 4 2 1 3
4


7
1 2 2 2 3 4 5
4

6
1 1 1 3 4 5
3
*/
View Code

 

C题 出队

是个CF原题额,就是换了个题面。http://codeforces.com/contest/950/problem/D

题目描述

约瑟夫问题(https://baike.baidu.com/item/约瑟夫问题),n个人,1 2报数 1出队( 就是体育课的时候1 2报数 1出队,2留下),q次询问,每次求第x个人是第几个出队的

输入描述:

第一行两个数n,q
接下来q行,每行一个数x,表示询问

输出描述:

一行输出一个询问的答案
示例1

输入

4 3
2
3
4

输出

3
2
4

说明

1 2 3 4围成一圈,第一轮:1 2报数,1出队,2留下,3出队,4留下,第二轮,2出队,4留下

备注:

q≤500000
n和x≤1e18

代码:
#include<stdio.h>
typedef long long ll;
int main()
{
    ll n,m,x;
    scanf("%lld%lld",&n,&m);
    while(m--)
    {
        scanf("%lld",&x);
        while(x%2==0)
        x=n+x/2;
        printf("%lld\n",(x+1)/2);
    }
    return 0;
}

posted on 2018-05-11 21:38  Esquecer  阅读(489)  评论(0编辑  收藏  举报

导航