题面:

https://www.luogu.org/problemnew/show/P3462

https://www.lydsy.com/JudgeOnline/problem.php?id=1110

https://szkopul.edu.pl/problemset/problem/y7tXjqVq0gPZjc8kPrscs2CJ/site/?key=statement


先打了个贪心。直接所有容器从大到小排序,按这个顺序处理容器,每个容器每次装能够装进且最大的砝码。用multiset维护。

WA了(貌似洛谷还骗到40分?)

然后想了想改了一下。先二分答案,对于每个二分出的答案x显然最好方案是取最小的x个砝码。然后就当做只有这些砝码,用前面的贪心判是否能够取完这些砝码。

错误记录:没有对砝码按重量排序...

A掉了?(n*log^2而且常数大,因此bzojA不掉,其他两个地方可以A)而且貌似容器不排序(甚至random_shuffle)都没有关系?

不太会证..

 #pragma GCC optimize("Ofast")
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
int n,m;
int a[],b[];
multiset<int> s;
bool judge(int x)
{
s.clear();
int i,t;multiset<int>::iterator i1;
for(i=;i<=x;++i)
s.insert(b[i]);
for(i=n;i>=;--i)
{
t=a[i];
while(!s.empty()&&((i1=s.upper_bound(t))!=s.begin()))
{
--i1;
t-=*i1;
s.erase(i1);
}
}
return s.empty();
}
int main()
{
int i;
scanf("%d%d",&n,&m);
for(i=;i<=n;++i)
scanf("%d",&a[i]);
sort(a+,a+n+);
for(i=;i<=m;++i)
scanf("%d",&b[i]);
sort(b+,b+m+);
int l=,r=m,mid;
while(l!=r)
{
mid=l+((r-l)>>);
if(judge(mid+)) l=mid+;
else r=mid;
}
printf("%d",l);
return ;
}

网上有高妙的一个log做法

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
int n,m;
int a[],b[],c[];
int d[];
int ans;
void try_work(int p)
{
if(p>c[]) return;
if(d[p]>=)
{
--d[p];
d[p-]+=c[p]/c[p-];
}
else
{
try_work(p+);
if(d[p]>=)
{
--d[p];
d[p-]+=c[p]/c[p-];
}
}
}
int main()
{
int i,j;
scanf("%d%d",&n,&m);
for(i=;i<=n;++i)
scanf("%d",&a[i]);
for(i=;i<=m;++i)
scanf("%d",&b[i]);
sort(b+,b+m+);
for(i=;i<=m;++i)
c[++c[]]=b[i];
c[]=unique(c+,c+c[]+)-c-;
for(i=;i<=n;++i)
for(j=c[];j>=;--j)
{
d[j]+=a[i]/c[j];
a[i]%=c[j];
}
for(i=,j=;i<=m;++i)
{
while(c[j]<b[i]) ++j;
if(d[j]>=)
{
--d[j];
++ans;
}
else
{
try_work(j+);
if(d[j]>=)
{
--d[j];
++ans;
}
}
}
printf("%d",ans);
return ;
}

最新文章

  1. GDB 多线程调试:只停止断点的线程,其他线程任然执行; 或只运行某些线程 其他线程中断
  2. poj2488骑士马走
  3. 使用 PHP 7 给 Web 应用加速
  4. 微软自带的Serialization和Newtonsoft简单测试
  5. Xcode 5.0.2 下载地址
  6. 五 浅谈CPU 并行编程和 GPU 并行编程的区别
  7. 深入理解ThreadLocal
  8. [leetcode]_Balanced Binary Tree
  9. Viewport解决分辨率适配问题
  10. linux下删除修改时间为某天之前的文件
  11. 分支-15. 日K蜡烛图
  12. 4.4、Libgdx用法查询执行环境相关性
  13. 【转】 Python subprocess模块学习总结
  14. spring mvc跨域(post)--filter方案
  15. SpringCloud-服务注册与发现(注册中心)
  16. linux 网络设置
  17. CefSharp 封装自己的简单H5浏览器 详细配置
  18. vue的异步组件按需加载
  19. Python线程,进程,携程,I/O同步,异步
  20. MyEclipse中复制web项目,部署之后访问报错

热门文章

  1. Windows程序设计(1)——Win32运行原理(二)
  2. android4.3 蓝牙BLE编程
  3. Codeforces Round #138 (Div. 2) A. Parallelepiped
  4. 写给精明Java开发者的测试技巧
  5. MSD3393/MSD3463 屏参及REG对照表
  6. 方法名的string类型应用(补)
  7. linux使用curl进行WebService接口测试
  8. 【网络爬虫】【java】微博爬虫(二):如何抓取HTML页面及HttpClient使用
  9. 7.11实习培训日志-Git Linux
  10. UVa 1349 Optimal Bus Route Design (最佳完美匹配)