56 条题解
-
11
PowderHan LV 10 @ 7 年前
-
16 年前@
/*把人按口的大小排序,并记录前缀和与蛋糕总数,显然,前缀和是递增的,那么这样,我们可以通过缩小二分范围来达到加速的目的。若所有的蛋糕都不能满足某一个人的口,那么可以将其删去
**
waste浪费,对于一块蛋糕,将其分出去一部分满足一些人后,倘若剩余部分连口最小的人都无法满足,那么剩余部分一定不能满足任何人,就属于浪费的部分。若蛋糕有用的部分(总数-浪费)不能满足前mid个人,那么当前二分的答案不可行
**
由于口是递增的,在dfs过程中,可能会遇到这么一种情况,第i个人与第i-1个人的口相同,那么考虑,若不能满足第i-1个人,那么一定不能满足第i个人,进行剪枝
*/#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
using namespace std;
int c[51],p[1100],n,m,b[51];
priority_queue<int> tmp;
bool cmp(int x,int y){
return x>y;
}
bool check(int N){
int i,j,time=1000;
while(time--){//既然拼RP,当然要多rand几遍
for(i=1;i<=n;i++)
b[i]=c[i];//复制一份蛋糕副本
random_shuffle(b+1,b+n+1);//该函数的功能是把一段区间随机打乱
int flag;
for(i=N;i>=1;i--){//这里对要满足的人从大到小枚举
flag=0;
for(j=1;j<=n;j++){//n比较小,暴力枚举蛋糕
if(b[j]>=p[i]){
flag=1;
b[j]-=p[i];
break;
}
}
if(!flag) break;//如果找不到可以满足这个口的蛋糕,说明不行
}
if(flag) return true;
}
return false;
}
int main(){
int i,j,l,r,mid,ans=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&c[i]);
scanf("%d",&m);
for(i=1;i<=m;i++)
scanf("%d",&p[i]);
sort(p+1,p+m+1);//贪心,口小的人优先取
l=0;r=m;
while(l<=r){//二分
mid=l+r>>1;
if(mid>=0&&check(mid)){
ans=mid;
l=mid+1;
}
else r=mid-1;
}
printf("%d",ans);
return 0;
} -
012 年前@
program ac;
var tot,leave,i,j,n,m,k,l,r,mid,ans,st:longint;
cake,mon,sum:array[0..1024] of longint;
check:boolean;
procedure swap(var x,y:longint);
var t:longint;
begin
t:=x; x:=y; y:=t;
end;
procedure qsort(l,r:longint);
var i,j,mid:longint;
begin
i:=l; j:=r; mid:=mon[(l+r) div 2];
repeat
while mon[i] -
014 年前@
#include
#include
#include
#include
#include#define MAXN 50
#define MAXM 1024using namespace std;
int cmp(const void *a , const void *b)
{
return ( *(int *)a - *(int *)b) ;
}int pack[MAXN + 1] , rail[MAXM + 1] , N , M , total = 0 , sumr[MAXM + 1] , space , Mid , bag[MAXN + 1];
bool Dfsid(int deep , int pos)
{
if (deep total - sumr[Mid]) return false ;
for (int i = pos ; i = rail[deep])
{
bag[i] -= rail[deep] ;
if (bag[i] < rail[1])
space += bag[i] ;
if (rail[deep] == rail[deep - 1])
{
if (Dfsid(deep - 1 , i)) return true ;
}
else
if (Dfsid(deep - 1 , 1)) return true ;
if (bag[i] < rail[1])
space -= bag[i];
bag[i] += rail[deep] ;
}
return false ;
}int main()
{
//freopen("tmp.in","r",stdin);
scanf("%d",&N);
for (int i = 1 ; i 1 ) ;
while (Left 1);
}
else
{
Right = Mid - 1 ;
Mid = ((Left + Right) >> 1);
}
}
printf("%d\n",Mid);
return 0 ;
} -
014 年前@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
├ 测试数据 11:答案正确... 0ms
├ 测试数据 12:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms改得不明不白就过了
-
015 年前@
USACO的经典搜索题:
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
├ 测试数据 11:答案正确... 0ms
├ 测试数据 12:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms -
015 年前@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
├ 测试数据 11:答案正确... 0ms
├ 测试数据 12:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms -
015 年前@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
├ 测试数据 11:答案正确... 0ms
├ 测试数据 12:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms终于秒杀了
2分写错了
BJ -
015 年前@
太艰难了,提交11次,只因
-
015 年前@
...友情提示。。不能二分。。
-
015 年前@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
├ 测试数据 11:答案正确... 0ms
├ 测试数据 12:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms完美的秒杀,能减就减,注意DFS-ID最好用二分。
附上源代码。program vijos;
var i,j,m,n,min,l,r:integer;
was,tot,x:longint;
boo:boolean;
cake:array[1..50] of longint;
eat,need:array[0..1024] of longint;
procedure sort(s,t:integer);
var i,j:integer;
x,z:longint;
begin
i:=s;
j:=t;
x:=need[(s+t) div 2];
repeat
while need[i] -
015 年前@
usaco上交过了
-
015 年前@
加二分枚举答案得不到正确解,为什么?
快排加上,最后一个点超时|无输出
换成泡排,0ms
why????? -
016 年前@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
├ 测试数据 11:答案正确... 0ms
├ 测试数据 12:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms -
016 年前@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
├ 测试数据 11:答案正确... 0ms
├ 测试数据 12:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0msAC!
-
016 年前@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
├ 测试数据 11:答案正确... 0ms
├ 测试数据 12:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms -
016 年前@
-
016 年前@
怎样剪啊
-
016 年前@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
├ 测试数据 11:答案正确... 0ms
├ 测试数据 12:答案正确... 0ms
二分+dfsid
状态 dfs(r,s,t);
r:蛋糕的搜索下界
s:搜索到第几个人
t:之前浪费的蛋糕量剪枝1:如果第s个人和第s-1个人想的相等,那么这两个人等效,那么我们假定s匹配的蛋糕在s-1的之前,即s-1 的r等于s-1匹配的蛋糕编号
剪枝2:如果之前浪费的蛋糕量t+人的总需求>蛋糕总量,那么剪掉 -
016 年前@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
├ 测试数据 11:答案正确... 0ms
├ 测试数据 12:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms艰难的AC历程!
终于做到0ms过拉
真的
剪枝是很有技巧的哦
就是下面的大牛所讲的那样就可以拉