http://codeforces.com/contest/106
昨天晚上白忙活了,哎
(codeforces的pretest的测试数据弱到不行啊,估计只有测试样例吧)
四题挂了三题
A:如此之水,也会挂,少写了一张牌 'A'
B:水题
C:题目看错,用贪心写,其实是裸多重背包
D:暴力超时,先预处理在每个格子往四个方向能走的最大距离,然后就是随便怎么搞都行
E:貌似是最小球覆盖,模拟退火(网上找的代码)
C:
#include<stdio.h>
#include<string.h>
int c[15],w[15],v[15];
int f[1005];
int main()
{
int n,m,p,q,a,b,i,j,k,amount;
scanf("%d%d%d%d",&n,&m,&p,&q);
c[1]=n/p;w[1]=p;v[1]=q;
for(i=1;i<=m;i++)
{
scanf("%d%d%d%d",&a,&b,&p,&q);
c[i+1]=a/b;
w[i+1]=p;
v[i+1]=q;
}
for(i=1;i<=n;i++)
f[i]=0;
for(i=1;i<=m+1;i++)
{
if(w[i]*c[i]>=n)
{
for(j=w[i];j<=n;j++)
if(f[j]<f[j-w[i]]+v[i])
f[j]=f[j-w[i]]+v[i];
}
else
{
k=1;
amount=c[i];
while(k<amount)
{
for(j=n;j>=k*w[i];j--)
if(f[j]<f[j-k*w[i]]+k*v[i])
f[j]=f[j-k*w[i]]+k*v[i];
amount-=k;
k*=2;
}
for(j=n;j>=amount*w[i];j--)
if(f[j]<f[j-amount*w[i]]+amount*v[i])
f[j]=f[j-amount*w[i]]+amount*v[i];
}
}
printf("%d\n",f[n]);
return 0;
}
D:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 1001
#define M 100001
int n,m,q;
char a[N][N];
int dis[N][N][4];
struct node
{
int dir;
int len;
}b[M];
void dfs()
{
int i,j,k,r;
for(i=1;i<n-1;i++)
{
j=1;
while(j<m-1)
{
while(j<m-1&&a[i][j]=='#')
j++;
r=j;k=j;
while(j<m-1&&a[i][j]!='#')
j++;
for(;r<j;r++)
{
dis[i][r][0]=r-k;
dis[i][r][1]=j-r-1;
}
}
}
for(j=1;j<m-1;j++)
{
i=1;
while(i<n-1)
{
while(i<n-1&&a[i][j]=='#')
i++;
r=i;k=i;
while(i<n-1&&a[i][j]!='#')
i++;
for(;r<i;r++)
{
dis[r][j][2]=r-k;
dis[r][j][3]=i-r-1;
}
}
}
}
int d[4][2]={{0,-1},{0,1},{-1,0},{1,0}};
int check(int i,int j)
{
int r=0,len,dir;
while(r<q)
{
dir=b[r].dir;len=b[r].len;
if(dis[i][j][dir]<len)
return 0;
i=i+len*d[dir][0];
j=j+len*d[dir][1];
r++;
}
return 1;
}
int ans[30];
int main()
{
int i,j,k;
char ch;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%s",a[i]);
scanf("%d",&q);
for(i=0;i<q;i++)
{
getchar();
scanf("%c%d",&ch,&b[i].len);
if(ch=='W') b[i].dir=0;
else if(ch=='E') b[i].dir=1;
else if(ch=='N') b[i].dir=2;
else b[i].dir=3;
}
dfs();
k=0;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
if(a[i][j]>='A'&&a[i][j]<='Z')
if(check(i,j))
{
ans[k++]=a[i][j];
}
if(k>0)
{
sort(ans,ans+k);
printf("%c",ans[0]);
for(i=1;i<k;i++)
printf("%c",ans[i]);
printf("\n");
}
else
printf("no solution\n");
return 0;
}
E:
#include<iostream>
#include<cmath>
using namespace std;
#define inf 1e20
#define eps 1e-7
#define N 120
struct point
{
double x,y,z;
}ps[N],q;
int n;
double dist(point a,point b)
{
a.x-=b.x;
a.y-=b.y;
a.z-=b.z;
return sqrt(a.x*a.x+a.y*a.y+a.z*a.z);
}
int maxdist(point p)
{
double res=0;
int k=0,i;
for(i=0;i<n;i++)
{
double tmp=dist(p,ps[i]);
if(tmp>res)
{
k=i;
res=dist(p,ps[i]);
}
}
return k;
}
int main()
{
int i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%lf%lf%lf",&ps[i].x,&ps[i].y,&ps[i].z);
if(n==1)
{
printf("%lf %lf %lf\n",ps[0].x,ps[0].y,ps[0].z);
return 0;
}
double step=20001;
double ans=inf;
q.x=q.y=q.z=0;
int k=1;
while(step>eps)
{
int d=maxdist(q);
double tmp=dist(ps[d],q);
if(ans>tmp)
ans=tmp;
double dx=ps[d].x-q.x;
double dy=ps[d].y-q.y;
double dz=ps[d].z-q.z;
dx=dx/tmp;
dy=dy/tmp;
dz=dz/tmp;
q.x+=dx*step;
q.y+=dy*step;
q.z+=dz*step;
step*=0.9985;
}
printf("%lf %lf %lf\n",q.x,q.y,q.z);
return 0;
}