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]); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/aaaaacmer/article/details/47404199