不充钱,你怎么AC?

  题目:http://codevs.cn/problem/2456/

  用贪心的思想,木材当然要尽量分成多的木板,而大的木材能够分成大木板,但是小的木材不一定能够分成大的木板,所以木板和木材都是从小到大开始选,然后要保证剩余的木材最少

  那么将木板和木材排序,对于每个木材,把能够分的小木板尽量分掉,如果遇到更大的木板则把最小的木板腾出来,然后在加上,这样保证剩余的木材最少

  因为是上午写得这道题,思路可能不连贯了,代码应该描述的很清楚

  虽然贪心在CodeVS上可以过,但是它是有数据可以卡掉的,而正解是DFS

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<cmath>
  7. using namespace std;
  8.  
  9. const int N=,M=;
  10. int a[N],b[M],next[M];
  11. bool f[M];
  12. int main()
  13. {
  14. int n,i,j,m,k,now,ans=,x,y;
  15. scanf("%d",&n);
  16. for (i=;i<=n;i++) scanf("%d",&a[i]);
  17. sort(a+,a++n);
  18. scanf("%d",&m);
  19. for (i=;i<=m;i++) scanf("%d",&b[i]);
  20. sort(b+,b++m);
  21. for (i=;i<=n;i++)
  22. {
  23. now=a[i];
  24. for (j=;j<=m;j++) next[j]=;
  25. for (j=;j<=m;j++)
  26. {
  27. if (f[j]) continue;
  28. if (now>=b[j])
  29. {
  30. now-=b[j];
  31. f[j]=;
  32. ans++;
  33. next[j]=next[];
  34. next[]=j;
  35. }
  36. else
  37. {
  38. k=x=;
  39. while (now+b[next[k]]>=b[j]) k=next[x=k];
  40. if (k)
  41. {
  42. next[x]=next[k];
  43. f[k]=;
  44. f[j]=;
  45. next[j]=next[];
  46. next[]=j;
  47. now+=b[k]-b[j];
  48. }
  49. }
  50. }
  51. }
  52. printf("%d\n",ans);
  53. return ;
  54. }

  下面是DFS的正解,贴的别人的代码

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<cmath>
  7. using namespace std;
  8.  
  9. #define N 1100
  10.  
  11. int n,m;
  12. int sum1,ans;
  13. int tim,res;
  14.  
  15. int a[N],b[N],c[N],sum[N];
  16.  
  17. int work(int x,int k)
  18. {
  19. if (!x)
  20. return true;
  21. if (tim>res)
  22. return false;
  23. for (int i=k;i<=n;i++)
  24. if (a[i]>=b[x])
  25. {
  26. a[i]-=b[x];
  27. if (a[i]<b[])
  28. tim+=a[i];
  29. if (b[x]==b[x-])
  30. {
  31. if (work(x-,i))
  32. return true;
  33. }
  34. else if (work(x-,))
  35. return true;
  36. if (a[i]<b[])
  37. tim-=a[i];
  38. a[i]+=b[x];
  39. }
  40. return false;
  41. }
  42.  
  43. int main()
  44. {
  45. scanf("%d",&n);
  46. for (int i=;i<=n;i++)
  47. scanf("%d",&a[i]),sum1+=a[i],c[i]=a[i];
  48. scanf("%d",&m);
  49. for (int i=;i<=m;i++)
  50. scanf("%d",&b[i]);
  51. sort(a+,a+n+);
  52. sort(b+,b+m+);
  53. for (int i=;i<=m;i++)
  54. sum[i]=b[i]+sum[i-];
  55. int l=,r=m;
  56. while (l!=r)
  57. {
  58. int mid=(l+r+)>>;
  59. tim=;
  60. res=sum1-sum[mid];
  61. if (work(mid,))
  62. l=mid;
  63. else
  64. r=mid-;
  65. for (int i=;i<=n;i++)
  66. a[i]=c[i];
  67. }
  68. printf("%d\n",l);
  69. return ;
  70. }

[ CodeVS冲杯之路 ] P2456的更多相关文章

  1. [ CodeVS冲杯之路 ] P1368

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1368/ 嗯……泡泡堂,很劲啊,其实就是个盗版的田忌赛马 http://www.cnblogs.com/hyfer/p/ ...

  2. [ CodeVS冲杯之路 ] P1092

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1092/ 嗯,这道题有一定难度啊,需要先用扩展欧几里得算法求出逆元,然后按照大小构一颗带边权为小时数的树 树链剖分后在树 ...

  3. [ CodeVS冲杯之路 ] P3955

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/3955/ 最长上升子序列的加强版,n 有1000000,n 方的 DP 肯定会 TLE,那么用二分栈维护 二分栈我讲不好 ...

  4. [ CodeVS冲杯之路 ] P1165

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1165/ 题目很简单,代码最好写朴实一点,不要想着哪些情况可以合并在一起啊等等 老老实实一个个判断,不然很容易出错 细节 ...

  5. [ CodeVS冲杯之路 ] P1053

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1053/ 直接扫一遍串,把字母对应的 ascii 码直接做数组下标,交给数组统计 最后查询一遍数组的 'a'-'z' , ...

  6. [ CodeVS冲杯之路 ] P1171

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1171/ 代码调了很久才调好啊,一开始题目都看错了(要是真的NOIP肯定没戏了QuQ) 后面发现CodeVS上的数据输入 ...

  7. [ CodeVS冲杯之路 ] P1197

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1197/ 密钥的字母可以全转换为小写字母,然后一一映射,a→0,b→1,c→2,依此类推 对于密文只需将每一位减去对应密 ...

  8. [ CodeVS冲杯之路 ] P2492

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/2492/ 在此先orz小胖子,教我怎么路径压缩链表,那么这样就可以在任意节点跳进链表啦(手动@LCF) 对于查询操作,直 ...

  9. [ CodeVS冲杯之路 ] P2952

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/2952/ 题目讲一个细胞可分裂成 2 个,那么当前数目就是2a,a 为时间 然后 q 个细胞一起会死亡,也就是对 q 取 ...

随机推荐

  1. fastlane自动化打包ipa并发布到firim或者蒲公英

    1.打开终端,确保Xcode Command Line Tools 安装了最新版 xcode-select --install 2.安装fastlane sudo gem install -n /us ...

  2. 一步一步构建手机WebApp开发——页面布局篇

    继上一篇:一步一步构建手机WebApp开发——环境搭建篇过后,我相信很多朋友都想看看实战案例,这一次的教程是页面布局篇,先上图: 如上图所示,此篇教程便是教初学者如何快速布局这样的页面.废话少说,直接 ...

  3. Win10开发笔记(一):一些VS2015中可能遇到的问题

    Win10开发者交流群:53078485 一.VS2015部署Win10程序到手机出现“0x80073CFD”错误解决方案 在VS2015 RC中创建了Windows Universal程序,部署到手 ...

  4. Jmeter——小性能用例

    1.添加默认值,将代理服务器写入 2.添加HTTP请求头,将域名部分用变量形式写入:${__CSVRead(D:/number.txt,0)},这是为了查询不同页面,在D:/number.txt路径下 ...

  5. React远程服务

    http://web1.dev5.net:3002/cloud/start?server=exf2&name=zhangxiaocong http://web1.dev5.net:3002/c ...

  6. Python杂篇

    一:文件保存 def save_to_file(file_name, contents): fh = open(file_name, 'w') fh.write(contents) fh.close( ...

  7. linux学习(一)——学习之路

    首先,要学Linux编程,你得会用Linux,也就是得在命令行环境下生存下来.什么叫生存下来呢?就是我现在给你一台主机,键盘,显示器啥的,然后给你一个服务器版的Linux系统的光盘或者其他什么安装盘, ...

  8. idea 快捷键(复制)

    Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最近的文件Ctrl+Shift+E,最近更改的文件Shift+Click,可以关闭文件Ctrl+[ ...

  9. ob_flush()和flush()的区别

    最近写定时任务,遇到ob_flush()和flush()混淆的问题... ob_flush/flush在手册中的描述, 都是刷新输出缓冲区, 并且还需要配套使用, 所以会导致很多人迷惑- 其实, 他们 ...

  10. JVM内存区域配置

    堆内存:新域+旧域 设置堆内存初始化大小 java -Xms128m 设置堆内存初始化大小128MB 设置堆内存最大大小 java -Xmx256m 设置堆内存最大256MB 通常将堆内存的初始化大小 ...