題目大意:給定一些整數點,問這些點能夠組成多少個正三角形或者是正方形、正五邊形、正六邊形。
思路:如果仔細想一想的話,這道題目是根本不存在正三角形、正五邊形、正六邊形的請款的。(在紙上畫圖看一看,可以發現確實不行。題目輸入是整數點)
所以題目變成:這些點能夠組成多少個正方形。看數據范圍,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]); } }