?
题目大意:给定一些整数点,问这些点能够组成多少个正三角形或者是正方形、正五边形、正六边形。
思路:如果仔细想一想的话,这道题目是根本不存在正三角形、正五边形、正六边形的请款的。(在纸上画图看一看,可以发现确实不行。题目输入是整数点)
所以题目变成:这些点能够组成多少个正方形。看数据范围,n<=20,坐标范围<=8。
题目瞬间简单了,暴力!暴力枚举4个点,然后判断这4个点是否能组成一个正方形。判断是否为正方形的方法很多,向量或者是距离。
我这里用的是算出4个点的距离,还有2个对角线的距离。如果能组成正方形,条件是:4条边长度相同,2条对角线长度相同。
?
#include
#include
#include
#include
#include
using namespace std; struct node{ int x,y; }p[22]; bool cmp(node a,node b){ if(a.x==b.x)return a.y
?
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
#include
#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 ,dp[n][0]+dp[n][1]); } }
?
?