BZOJ1110 : [POI2007]砝码Odw

砝码从小到大放最优,二分答案mid,转化为判定前mid小的砝码能否放完。

从大到小考虑砝码,依次扫描每个容器,能放就放。

由于砝码重量都成倍数关系,所以最多只有$O(\log n)$种不同的数字,所以总复杂度为$O(n\log^2n)$。

#include<cstdio>
#include<algorithm>
#define N 100010
int n,m,i,j,k,t,a[N],b[N],c[N],l,r,mid,ans;
inline void read(int&a){char c;while(!(((c=getchar())>=‘0‘)&&(c<=‘9‘)));a=c-‘0‘;while(((c=getchar())>=‘0‘)&&(c<=‘9‘))(a*=10)+=c-‘0‘;}
bool check(int x){
  for(i=1;i<=n;i++)c[i]=a[i];
  for(;x;x=j){
    for(j=x-1;b[x]==b[j];j--);
    for(t=x-j,i=1;i<=n&&t;i++){
      k=c[i]/b[x];
      if(k>t)k=t;
      c[i]-=k*b[x],t-=k;
    }
    if(t)return 0;
  }
  return 1;
}
int main(){
  read(n),read(m);
  for(i=1;i<=n;i++)read(a[i]);
  for(i=1;i<=m;i++)read(b[i]);
  std::sort(b+1,b+m+1),l=1,r=m;
  while(l<=r)if(check(mid=(l+r)>>1))l=(ans=mid)+1;else r=mid-1;
  return printf("%d",ans),0;
}

  

时间: 2024-11-05 12:23:10

BZOJ1110 : [POI2007]砝码Odw的相关文章

【BZOJ1110】[POI2007]砝码Odw 贪心

[BZOJ1110][POI2007]砝码Odw Description 在byteotian公司搬家的时候,他们发现他们的大量的精密砝码的搬运是一件恼人的工作.公司有一些固定容量的容器可以装这些砝码.他们想装尽量多的砝码以便搬运,并且丢弃剩下的砝码.每个容器可以装的砝码数量有限制,但是他们能够装的总重量不能超过每个容器的限制.一个容器也可以不装任何东西.任何两个砝码都有一个特征,他们的中总有一个的重量是另外一个的整数倍,当然他们也可能相等. Input 第一行包含两个数n和m.表示容器的数量以

BZOJ 1110: [POI2007]砝码Odw

1110: [POI2007]砝码Odw Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 547  Solved: 296[Submit][Status][Discuss] Description 在byteotian公司搬家的时候,他们发现他们的大量的精密砝码的搬运是一件恼人的工作.公司有一些固定容量的容器可以装这些砝码.他们想装尽量多的砝码以便搬运,并且丢弃剩下的砝码.每个容器可以装的砝码数量有限制,但是他们能够装的总重量不能超过每个容器的限制

BZOJ 1110: [POI2007]砝码Odw( 贪心 )

ORZjcvb... 1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 const int maxn = 100009; 6 7 int N, M, item[maxn], V[maxn]; 8 vector<int> o, cnt, Div; 9 10 int main() { 11 12 cin >> N >> M; 13 for(int i = 0; i < N; i++) 14 sca

【搭楼】做题记录

以后做了题还是在这里写一下,觉得好的再去发题解(感觉无脑发题解意义不大) 也不一定是做了的题,看了没打但觉得不错的也可以发上来 (5.23-5.24 第三次月考被X得相当爽) 5.23 星期六 [贪心]Bzoj4027 HEOI2014 兔子与樱花 要是父亲合并儿子又合并就混乱了.然后发现,反正贡献都是一?能合并就在儿子处合并?贪心. [分块]Bzoj3343 教主的魔法 做之前知道了tag,于是很快就想到了算法.还没打过分块呢,于是先去膜拜了一下别人的代码.自己打出来后各种WA,太晚了没调出来

【整理】最近做的几道数学题

数学题也是有意思 那么总结一下 T1.[Bzoj2751][HAOI2012]容易题 题意 有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些限制即A[i]不能取哪些值,我们定义一个数列的积为该数列所有元素的乘积,求出所有可能的数列的积的和. 题解 考虑一个式子(...)(...)(...),()内为一些数相加,根据乘法分配律,打开这个式子就是每次从每个括号中选一个元素,再把所有可能选择的结果加起来. 这件事情就是我们题目的设问,于是我们只要算出来每个位置sigma可能的选择

BZOJ 1111: [POI2007]四进制的天平Wag

1111: [POI2007]四进制的天平Wag Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 223  Solved: 151[Submit][Status][Discuss] Description Mary准备举办一个聚会,她准备邀请很多的人参加她的聚会.并且她准备给每位来宾准备一些金子作为礼物.为了不伤及每个人的脸面,每个人获得的金子必须相同.Mary将要用一个天平来称量出金子.她有很多的砝码,所有砝码的质量都是4的幂.Mary将金子置于

1449 砝码称重

1449 砝码称重 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 现在有好多种砝码,他们的重量是 w0,w1,w2,...  每种各一个.问用这些砝码能不能表示一个重量为m的东西. 样例解释:可以将重物和3放到一个托盘中,9和1放到另外一个托盘中. Input 单组测试数据. 第一行有两个整数w,m (2 ≤ w ≤ 10^9, 1 ≤ m ≤ 10^9). Output 如果能,输出YES,否则输出NO. Input示例

2144 砝码称重 2

2144 砝码称重 2 http://codevs.cn/problem/2144/ 题目描述 Description 有n个砝码,现在要称一个质量为m的物体,请问最少需要挑出几个砝码来称? 注意一个砝码最多只能挑一次 输入描述 Input Description 第一行两个整数n和m,接下来n行每行一个整数表示每个砝码的重量. 输出描述 Output Description 输出选择的砝码的总数k,你的程序必须使得k尽量的小. 样例输入 Sample Input 3 10591 样例输出 Sa

砝码问题之二(完全背包问题)

有一组砝码,重量互不相等,分别为m1.m2.m3……mn:每种砝码的数量有无限个. 现要用这些砝码去称物体的重量,给你一个重量n,请你判断有给定的砝码能否称出重量n. 现在给你一个正整数列表w和一个正整数n,列表w中的第i个元素w[i]表示第i种砝码的重量, n表示要你判断的重量.如果给定砝码能称出重量n,输出Yes,否则输出No. 例如,w=[2,5,11], n=9,则输出Yes(取两个2,一个5). w = [2, 5, 11] n = 9 S = [-1 for i in xrange(