传送门 :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 54 1 1 1 1 16 1 2 3 4 5 2 47 2 2 2 2 1 1 1 36 2 2 2 2 1 1 27 1 2 2 2 2 2 3 35 4 4 4 4 1 45 4 4 4 2 1 46 4 4 4 2 1 3 47 1 2 2 2 3 4 5 46 1 1 1 3 4 5 3 */
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; }