码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 5365+hdu 5355

时间:2015-08-10 22:18:47      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:hdu   枚举   c语言   

5365

题目链接:点击打开链接

题目大意:给定一些整数点,问这些点能够组成多少个正三角形或者是正方形、正五边形、正六边形。

思路:如果仔细想一想的话,这道题目是根本不存在正三角形、正五边形、正六边形的请款的。(在纸上画图看一看,可以发现确实不行。题目输入是整数点)

所以题目变成:这些点能够组成多少个正方形。看数据范围,n<=20,坐标范围<=8。

题目瞬间简单了,暴力!暴力枚举4个点,然后判断这4个点是否能组成一个正方形。判断是否为正方形的方法很多,向量或者是距离。

我这里用的是算出4个点的距离,还有2个对角线的距离。如果能组成正方形,条件是:4条边长度相同,2条对角线长度相同。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
	int x,y;
}p[22];
bool cmp(node a,node b){
	if(a.x==b.x)return a.y<b.y;
	return a.x<b.x;
}
int main()
{
	double d[10];
	int n,i,j,k,l,ans;
	while(scanf("%d",&n)!=EOF)
	{
		ans=0;
		for(i=0;i<n;i++)
		scanf("%d%d",&p[i].x,&p[i].y);
		sort(p,p+n,cmp);
		for(i=0;i<n;i++)
		{
			for(j=i+1;j<n;j++)
			for(k=j+1;k<n;k++)
			for(l=k+1;l<n;l++)
			{
				d[1]=(p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y);
				d[2]=(p[j].x-p[k].x)*(p[j].x-p[k].x)+(p[j].y-p[k].y)*(p[j].y-p[k].y);
				d[3]=(p[k].x-p[l].x)*(p[k].x-p[l].x)+(p[k].y-p[l].y)*(p[k].y-p[l].y);
				d[4]=(p[l].x-p[i].x)*(p[l].x-p[i].x)+(p[l].y-p[i].y)*(p[l].y-p[i].y);
				d[5]=(p[i].x-p[k].x)*(p[i].x-p[k].x)+(p[i].y-p[k].y)*(p[i].y-p[k].y);
				d[6]=(p[j].x-p[l].x)*(p[j].x-p[l].x)+(p[j].y-p[l].y)*(p[j].y-p[l].y);
				sort(d+1,d+7);
			//	printf("%.2f %.2f %.2f %.2f %.2f %.2f\n",d1,d2,d3,d4,d5,d6);
				if(d[1]==d[2]&&d[2]==d[3]&&d[3]==d[4]&&d[4]==d[1]&&d[5]==d[6])ans++;
			}
		}
     printf("%d\n",ans);
	}
	return 0;
}


5366

题目链接:点击打开链接

题目大意:给一些位置,上面可以放木桩。放置条件是两个木桩之间至少要有2个空格的距离。问放n个木桩的放法。

思路:这题可以考虑用dp解决。我们设dp[i][0],dp[i][1]分别为在第i 个位置上不放和放木桩。

考虑dp[i][1]的时候,其左侧两个空位不能放木桩,左侧的第三个位置可放可不放。所以dp[i][1]=dp[i-3][1]+dp[i-3][0]+1。

考虑dp[i][0]的时候,其左侧的的第一个空位可放可不放。所以dp[i][0]=dp[i-1][0]+dp[i-1][1]。

答案就是dp[i][1]+dp[i][0]。

#include<stdio.h>
#include<string.h>
#define LL __int64 
 LL dp[66][2];
int main()
{
	int n,i,j,k;
	dp[1][0]=1;
	dp[0][0]=0;
	dp[2][1]=1;
	dp[2][0]=1;
	dp[3][1]=1;
	dp[3][0]=2;
	for(i=4;i<=60;i++)
	{
		dp[i][1]=dp[i-3][1]+dp[i-3][0]+1;
		dp[i][0]=dp[i-1][1]+dp[i-1][0];
	}
	while(scanf("%d",&n)!=EOF)
	{
		printf("%I64d\n",dp[n][0]+dp[n][1]);
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 5365+hdu 5355

标签:hdu   枚举   c语言   

原文地址:http://blog.csdn.net/aaaaacmer/article/details/47404199

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!