悲剧的codeforces 82

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;
}
 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值