1.油滴扩展(box)
搜索,注意精度。
#include<fstream>
#include<cmath>
#define pi 3.1415926575897932
using namespace std;
ifstream cin("box.in");
ofstream cout("box.out");
int n;
int x,y,xx,yy;
double tot=0,ans=0;
bool v[8];
struct list
{
int x,y;
double r;
}d[8];
void dfs(int a,double sum)
{
if (a==(n+1))
{
if (sum>ans) ans=sum;
return;
}
for (int j=1;j<=n;j++)
if (!v[j])
{
d[j].r=min(min(min(abs((double)(d[j].x-x)),abs((double)(d[j].x-xx))),abs((double)(d[j].y-y))),abs((double)(d[j].y-yy)));
for (int i=1;i<=n;i++)
if (v[i])
{
double t=sqrt(abs((double)(d[j].x-d[i].x))*abs((double)(d[j].x-d[i].x))+abs((double)(d[j].y-d[i].y))*abs((double)(d[j].y-d[i].y)));
t-=d[i].r;
if (t<0) t=0;
d[j].r<?=t;
}
v[j]=true;
dfs(a+1,sum+pi*d[j].r*d[j].r);
v[j]=false;
}
}
int main()
{
cin>>n;
cin>>x>>y>>xx>>yy;
for (int i=1;i<=n;i++) cin>>d[i].x>>d[i].y;
dfs(1,0);
tot=abs((double)(x-xx))*abs((double)(y-yy));
int rest=(int)(tot-ans+0.5);
cout<<rest<<endl;
return 0;
}
2.数列(sequence)
f[i,j]=max{f[i-1,j-1],f[i-1,j]+(a[i]=i-j)}
#include<fstream>
using namespace std;
ifstream cin("sequence.in");
ofstream cout("sequence.out");
int n,a[1100];
int f[1100][1100]={0};
int main()
{
int i,j;
cin>>n;
for (i=1;i<=n;i++) cin>>a[i];
for (i=1;i<=n;i++)
for (j=1;j<=i;j++)
{
f[i][j]=max(f[i-1][j],f[i-1][j-1]);
if (a[i]==(i-j+1)) f[i][j]=max(f[i][j],f[i-1][j]+1);
}
int ans=0;
for (i=1;i<=n;i++)
ans>?=f[n][i];
cout<<ans<<endl;
return 0;
}
3.SOFTWARE
二分答案,判断条件f[i,j+k]=max{f[i-1,j]+(mid-k*a[i])/b[i]} (k+j<=m&&mid>=a[i]*k)
#include<fstream>
#include<cstdlib>
using namespace std;
ifstream cin("software.in");
ofstream cout("software.out");
int n,m,maxtime;
struct list
{
int a,b;
}d[110];
int f[110][110];
bool check(int mid)
{
memset(f,-1,sizeof(f));
f[0][0]=0;
for (int i=1;i<=n;i++)
for (int j=0;j<=m;j++)
{
if (f[i-1][j]<0) continue;
for (int k=0;(j+k<=m) && (mid>=d[i].a*k);k++)
f[i][j+k]>?=f[i-1][j]+((mid-k*d[i].a)/d[i].b);
}
return (f[n][m]>=m);
}
int main()
{
cin>>n>>m;
for (int i=1;i<=n;i++)
{
cin>>d[i].a>>d[i].b;
maxtime>?=d[i].a;
maxtime>?=d[i].b;
}
int l=0,r=m*maxtime,mid;
while (l<r)
{
mid=(l+r)>>1;
if (!check(mid)) l=mid+1;
else r=mid;
}
cout<<l<<endl;
return 0;
}
4.黑匣子(blackbox)
二分查找树
代码
program blackbox;
type rec=^node;
node=record
num,tot:longint;
l,r:rec;
end;
var a,b:array[0..200000]of longint;
i,j,k,m,n,last:longint;
root:rec;
procedure add(var p:rec;x:longint);
begin
if p=nil then
begin
new(p);
p^.num:=x;
p^.tot:=1;
p^.l:=nil;
p^.r:=nil;
end
else
begin
inc(p^.tot);
if x<p^.num then add(p^.l,x)
else add(p^.r,x);
end;
end;
procedure dfs(p:rec;k:longint);
var tt:longint;
begin
if p^.l=nil then tt:=1
else tt:=p^.l^.tot+1;
if k=tt then writeln(p^.num)
else if k<tt then dfs(p^.l,k) else dfs(p^.r,k-tt);
end;
begin
assign(input,'blackbox.in');reset(input);
assign(output,'blackbox.out');rewrite(output);
readln(m,n);
for i:=1 to m do read(a[i]);
last:=1;
k:=0;
root:=nil;
for i:=1 to n do
begin
read(b[i]);
for j:=last to b[i] do add(root,a[j]);
inc(k);
dfs(root,k);
last:=b[i]+1;
end;
close(input);close(output);
end.

浙公网安备 33010602011771号