Codeforces 309C Memory for Arrays 二进制模拟进位

题目链接:点击打开链接

题意:

给定n个箱子m个物品

下面n个数字表示箱子的容量

下面m个数字b1-bm 表示物品体积为2^bi大

问最多有多少个物品可以放入箱子。

思路:

贪心,先放小的,小的不能放再放大的

显然我们把n个箱子拆成二进制,然后模拟二进制减法运算。

剩下就是简单模拟

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<set>
#include<queue>
#include<map>
#include<vector>
using namespace std;

#define ll __int64

#define N 50
ll n,_gcd,m,k;
ll a[N],b[N],er[N];
bool jie(ll pos, ll ge){
	bool hav = false;
	ll now;
	for(ll i = pos+1; i < N; i++)
		if(a[i]){
			hav = true;
			now = i;
			break;
		}
		if(hav==false)return false;
		ll ned = ge / er[now-pos];
		if(ned==0){
			a[now]--;
			a[pos]++;
			for(ll i = pos; i < now; i++)
				a[i]++;
			return true;
		}
		ned = min(ned, a[now]);
		a[now] -= ned;
		a[pos] += ned*er[now-pos];
		return true;
}
int main(){
	ll i, u;
	for(i=0, u = 1;i<N;i++, u<<=1)
		er[i] = u;
	while(cin>>n>>m) {
		memset(a, 0, sizeof a);
		memset(b, 0, sizeof b);
		while(n--){
			scanf("%I64d",&u);
			for(i=0;i<N && u>=er[i];i++){
				if(u&er[i]){
					a[i]++;
				}
			}
		}
		ll ans = 0;
		while(m--){
			scanf("%I64d",&u);
			b[u]++;
		}
		bool hav = false;
		for(i=0;i<N;i++)if(b[i]){
			while(b[i]){
				ll now = min(a[i],b[i]);
				ans += now;
				a[i]-=now;
				b[i]-=now;
				if(b[i])
				{
					if(!jie(i, b[i]))
					{
						hav = false;
						break;
					}
				}
					else break;
			}
			if(hav)break;
		}
		cout<<ans<<endl;
	}
	return 0;
}

Codeforces 309C Memory for Arrays 二进制模拟进位

时间: 2024-10-13 11:03:22

Codeforces 309C Memory for Arrays 二进制模拟进位的相关文章

Codeforces 97D Robot in Basement bitset+模拟

题目链接:点击打开链接 题意: 每个点有一个机器人(.),下面是一些指令,每次发出指令(一个字母)所有机器人都会执行移动. 当机器人到E点就会离开. 若机器人前方是'#' 或者边界则停留原地.一个方格可以站多个机器人. bitset模拟.. #include <cstdio> #include <cstring> #include <algorithm> #include <bitset> using namespace std; char s[100005

Codeforces 12D Ball 树状数组模拟3个元素的排序

题目链接:点击打开链接 #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<math.h> #include<queue> #include<string> #include<stdlib.h> #include<a

codeforces 459C Pashmak and Buses(模拟,组合数A)

题目 跑个案例看看结果就知道了:8 2 3 题目给的数据是 n,k,d 相当于高中数学题:k个人中选择d个人排成一列,有多少种不同的方案数,列出其中n中就可以了. #include<iostream> #include<algorithm> #include<string> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h>

CodeForces 388A Fox and Box Accumulation (模拟)

A. Fox and Box Accumulation time limit per test:1 second memory limit per test:256 megabytes Fox Ciel has n boxes in her room. They have the same size and weight, but they might have different strength. The i-th box can hold at most xi boxes on its t

CodeForces - 7A Kalevitch and Chess(搜索?!模拟!)

Kalevitch and Chess Time Limit: 2000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status Description A famous Berland's painter Kalevitch likes to shock the public. One of his last obsessions is chess. For more than a thousand ye

CodeForces - 670D1 Magic Powder - 1 (模拟)

CodeForces - 670D1 Magic Powder - 1 Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Status Description This problem is given in two versions that differ only by constraints. If you can solve this problem in large c

Codeforces 46D Parking Lot(贪心模拟)

Codeforces 46D Parking Lot 题目链接 开线段树专题开出了这题..看似要用区间合并求连续最大区间,其实不需要.因为询问才100个,直接set暴力去模拟即可,每次车进来就从左往右找到一个合适位置 代码: #include <cstdio> #include <cstring> #include <set> using namespace std; const int N = 100005; int L, b, f, n; set<int>

Codeforces 475C Kamal-ol-molk&amp;#39;s Painting 模拟

主题链接:点击打开链接 意甲冠军:特定n*m矩阵 X代表色 .代表无色 随着x*y形刷子去涂色. 刷子每次能够→或↓移动随意步. 若可以染出给定的矩阵,则输出最小的刷子的面积 若不能输出-1 思路: 先找到连续最小的x,y 由于至少一个边界和x或y相等,所以枚举(x,i) 和 (i,y)就能够了. #pragma comment(linker, "/STACK:102400000,102400000") #include <stdio.h> #include <ios

Codeforces #366 Div. 2 C. Thor (模拟

http://codeforces.com/contest/705/problem/C 题目 模拟题 : 设的方法采用一个 r 数组(第几个app已经阅读过的消息的数量),和app数组(第几个app发出的消息的总数),加上一个 q 队列. 思路: 查询==1的时候,入队(记录顺序), sum++ (sum 为全部的剩余 没阅读的数量) 查询==2的时候,针对一个app,sum -(这个app发出的消息的总数 - 这个app已经阅读过的消息的数量),然后用 app数组 更新 r 数组,表示这个ap