牛客網Wannafly挑戰賽15 B車輛安排(模擬)AND C 出隊(規律)

傳送門 :B題:點我

    C題: 點我

題目描述ios

有n個隊伍,每一個隊伍的人數小於等於5,每輛車最多坐5我的,要求一個隊伍的人都在一輛車上,求最少的車數ide

輸入描述:測試

第一行n
第二行n個數,表示每一個隊伍的人數spa

輸出描述:code

輸出最少車數blog

示例1

輸入

3
3 4 5

輸出

3

備註:get

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題 出隊string

是個CF原題額,就是換了個題面。http://codeforces.com/contest/950/problem/Dit

題目描述

約瑟夫問題(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;
}
相關文章
相關標籤/搜索