題目描述ios
有n個隊伍,每一個隊伍的人數小於等於5,每輛車最多坐5我的,要求一個隊伍的人都在一輛車上,求最少的車數ide
輸入描述:測試
第一行n
第二行n個數,表示每一個隊伍的人數spa
輸出描述:code
輸出最少車數blog
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 */
C題 出隊string
是個CF原題額,就是換了個題面。http://codeforces.com/contest/950/problem/Dit
第一行兩個數n,q
接下來q行,每行一個數x,表示詢問
一行輸出一個詢問的答案
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; }