[ CodeVS冲杯之路 ] P2456
不充钱,你怎么AC?
题目:http://codevs.cn/problem/2456/
用贪心的思想,木材当然要尽量分成多的木板,而大的木材能够分成大木板,但是小的木材不一定能够分成大的木板,所以木板和木材都是从小到大开始选,然后要保证剩余的木材最少
那么将木板和木材排序,对于每个木材,把能够分的小木板尽量分掉,如果遇到更大的木板则把最小的木板腾出来,然后在加上,这样保证剩余的木材最少
因为是上午写得这道题,思路可能不连贯了,代码应该描述的很清楚
虽然贪心在CodeVS上可以过,但是它是有数据可以卡掉的,而正解是DFS
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std; const int N=,M=;
int a[N],b[M],next[M];
bool f[M];
int main()
{
int n,i,j,m,k,now,ans=,x,y;
scanf("%d",&n);
for (i=;i<=n;i++) scanf("%d",&a[i]);
sort(a+,a++n);
scanf("%d",&m);
for (i=;i<=m;i++) scanf("%d",&b[i]);
sort(b+,b++m);
for (i=;i<=n;i++)
{
now=a[i];
for (j=;j<=m;j++) next[j]=;
for (j=;j<=m;j++)
{
if (f[j]) continue;
if (now>=b[j])
{
now-=b[j];
f[j]=;
ans++;
next[j]=next[];
next[]=j;
}
else
{
k=x=;
while (now+b[next[k]]>=b[j]) k=next[x=k];
if (k)
{
next[x]=next[k];
f[k]=;
f[j]=;
next[j]=next[];
next[]=j;
now+=b[k]-b[j];
}
}
}
}
printf("%d\n",ans);
return ;
}
下面是DFS的正解,贴的别人的代码
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std; #define N 1100 int n,m;
int sum1,ans;
int tim,res; int a[N],b[N],c[N],sum[N]; int work(int x,int k)
{
if (!x)
return true;
if (tim>res)
return false;
for (int i=k;i<=n;i++)
if (a[i]>=b[x])
{
a[i]-=b[x];
if (a[i]<b[])
tim+=a[i];
if (b[x]==b[x-])
{
if (work(x-,i))
return true;
}
else if (work(x-,))
return true;
if (a[i]<b[])
tim-=a[i];
a[i]+=b[x];
}
return false;
} int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++)
scanf("%d",&a[i]),sum1+=a[i],c[i]=a[i];
scanf("%d",&m);
for (int i=;i<=m;i++)
scanf("%d",&b[i]);
sort(a+,a+n+);
sort(b+,b+m+);
for (int i=;i<=m;i++)
sum[i]=b[i]+sum[i-];
int l=,r=m;
while (l!=r)
{
int mid=(l+r+)>>;
tim=;
res=sum1-sum[mid];
if (work(mid,))
l=mid;
else
r=mid-;
for (int i=;i<=n;i++)
a[i]=c[i];
}
printf("%d\n",l);
return ;
}
[ CodeVS冲杯之路 ] P2456的更多相关文章
- [ CodeVS冲杯之路 ] P1368
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1368/ 嗯……泡泡堂,很劲啊,其实就是个盗版的田忌赛马 http://www.cnblogs.com/hyfer/p/ ...
- [ CodeVS冲杯之路 ] P1092
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1092/ 嗯,这道题有一定难度啊,需要先用扩展欧几里得算法求出逆元,然后按照大小构一颗带边权为小时数的树 树链剖分后在树 ...
- [ CodeVS冲杯之路 ] P3955
不充钱,你怎么AC? 题目:http://codevs.cn/problem/3955/ 最长上升子序列的加强版,n 有1000000,n 方的 DP 肯定会 TLE,那么用二分栈维护 二分栈我讲不好 ...
- [ CodeVS冲杯之路 ] P1165
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1165/ 题目很简单,代码最好写朴实一点,不要想着哪些情况可以合并在一起啊等等 老老实实一个个判断,不然很容易出错 细节 ...
- [ CodeVS冲杯之路 ] P1053
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1053/ 直接扫一遍串,把字母对应的 ascii 码直接做数组下标,交给数组统计 最后查询一遍数组的 'a'-'z' , ...
- [ CodeVS冲杯之路 ] P1171
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1171/ 代码调了很久才调好啊,一开始题目都看错了(要是真的NOIP肯定没戏了QuQ) 后面发现CodeVS上的数据输入 ...
- [ CodeVS冲杯之路 ] P1197
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1197/ 密钥的字母可以全转换为小写字母,然后一一映射,a→0,b→1,c→2,依此类推 对于密文只需将每一位减去对应密 ...
- [ CodeVS冲杯之路 ] P2492
不充钱,你怎么AC? 题目:http://codevs.cn/problem/2492/ 在此先orz小胖子,教我怎么路径压缩链表,那么这样就可以在任意节点跳进链表啦(手动@LCF) 对于查询操作,直 ...
- [ CodeVS冲杯之路 ] P2952
不充钱,你怎么AC? 题目:http://codevs.cn/problem/2952/ 题目讲一个细胞可分裂成 2 个,那么当前数目就是2a,a 为时间 然后 q 个细胞一起会死亡,也就是对 q 取 ...
随机推荐
- 「日常训练」 Finite or not? (CFR483D2C)
题意(Codeforces 984C) 给定p,q,b" role="presentation">p,q,bp,q,b,问pq" role="p ...
- 初探 Qt Opengl【2】
最近在研究QOPengl QGraphicsView QGraphicsItemQGraphicsScene不过也只是皮毛,也不是做什么技术贴,就是记录一下自己在其中遇到的问题,和自己新学到的东西. ...
- 寻找完全数(C++)
[问题描述] 输入一个大于 1 的正整数 n,请你将大于 1 和小于或等于 n 的所有完全数输出.所谓完全数就是因子(不算其本身)之和等于它本身的数.例如 1+2+4+7+14=28,所以 28 是完 ...
- 【iOS开发】iOS CGRectGetMaxX/Y 使用
在iOS的界面布局中我们可以使用CGRectGetMaxX 这个方法来方便的获取当前控件的x坐标值+宽度的数值,这样便可以方便布局. 同理CGRectGetMaxY是获取y坐标值+控件高度的值,当然这 ...
- lock关键字的使用
最近在代码中,发现别人使用了lock关键字,为了理解别人写的代码,所以自己对lock关键字的使用研究了下. 微软官方解释,请百度:lock 语句(C# 参考) 微软给了个官网实例代码: class A ...
- PHP全局变量局部变量
http://www.w3school.com.cn/php/php_variables.asp
- C++ Profiler工具之初体验
http://www.cnblogs.com/likwo/archive/2012/12/20/2826988.html 转 http://www.cnblogs.com/lenolix/archiv ...
- 牛客网(string::find()函数回忆一下)
链接:https://www.nowcoder.com/acm/contest/109/B来源:牛客网 给出两个串s和x 定义s中的某一位i为好的位置,当且仅当存在s的子序列 满足y=x且存在j使得i ...
- JavaScript五种继承方式详解
本文抄袭仅供学习http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html 一. 构造函数绑定 ...
- javascript string对象方法replace
最简单的replace用法是: var str = 'aaaaa9876b0000'; str.replace(/a/g,'A'); 有时候我们希望只是在匹配的位置添加特定的字符: var str = ...