程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Codeforces Round #313 (Div. 2) C

Codeforces Round #313 (Div. 2) C

編輯:關於C++

題目鏈接

題意:

有一個六邊形,給你6條邊的長度(順時針給出),每條邊都是整數,問你它可以被分割成幾個單位長度的正三角形 (題目保證給出的數據可以被分割) 思路: 六邊形可以被分割成兩種情況: ①被分成上下兩個等腰梯形 \
②被分成等腰梯形-平行四邊形-等腰梯形 \

其實這兩種可以統為一種,因為當第二種平行四邊形的一對平行邊長為0的時間就變成了第一種。 給這六條邊標號 \

六邊形旋轉到某個狀態的時候, 一定會形成等腰梯形-平行四邊形-等腰梯形的狀態(或只有兩個等腰梯形) 上下兩個梯形的腰分別是 min(a2, a6), min(a3, a5) 平行四邊形的一對平行邊長為 abs(a2-a6) 將這三塊面積加起來就可以了 所以我們只要去尋找a1這條邊(for i = 1 ~3),使得 a2 + a6 == a3 + a5 即可 代碼如下:
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N = 1005;
int n;
int a[10];

int main()
{
	for(int i = 1; i <= 6; i++)
	{
		scanf(%d, &a[i]);
	}
	for(int i = 1; i <= 3; i++)
	{
		if((a[2] + a[3]) == (a[5] + a[6])) break;
		else
		{
			int f = a[1];
			for(int j = 1; j < 6; j++)
			{
				a[j] = a[j+1];
			}
			a[6] = f;
		}
	}
	int x = min(a[2], a[6]), y = min(a[3], a[5]);
	int l = abs(a[2] - a[6]);
	ll sum = 0;
	int cnt = a[1];
	for(int i = 1;  i <= x; i++)
	{
		sum += (ll)2  * cnt + 1; //加上上面那個等腰梯形的面積 
		++cnt;
	}
	sum += (ll) 2 * cnt  * l;  //加上平行四邊形面積 
	cnt--;
	for(int i = 1; i <= y;  i++)
	{
		sum += (ll)2 * cnt + 1;  //加上下面那個等腰梯形的面積 
		--cnt;
	}
	printf(%I64d
, sum);
	return 0;
}


 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved