• Codeforces Round #313 (Div. 2) C


    题目链接

    题意:

     有一个六边形,给你6条边的长度(顺时针给出)。每条边都是整数,问你它能够被切割成几个单位长度的正三角形 
    (题目保证给出的数据能够被切割)
    思路:
    六边形能够被切割成两种情况:
    ①被分成上下两个等腰梯形

    ②被分成等腰梯形-平行四边形-等腰梯形


    事实上这两种能够统为一种,由于当另外一种平行四边形的一对平行边长为0的时间就变成了第一种。
    给这六条边标号


    六边形旋转到某个状态的时候。 一定会形成等腰梯形-平行四边形-等腰梯形的状态(或仅仅有两个等腰梯形)
    上下两个梯形的腰各自是 min(a2, a6), min(a3, a5) 平行四边形的一对平行边长为 abs(a2-a6)
    将这三块面积加起来就能够了
    所以我们仅仅要去寻找a1这条边(for i = 1 ~3),使得 a2 + a6 == a3 + a5 就可以
    代码例如以下:
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<map>
    #include<cmath>
    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;
    }


  • 相关阅读:
    java_十进制数转换为二进制,八进制,十六进制数的算法
    vim常用命令 vim键盘布局
    百度HTTPS加密搜索有什么用?
    delete
    hadoop2的automatic HA+Federation+Yarn配置的教程
    MinGW GCC下sleep()函数问题
    delete
    8天学通MongoDB——第一天 基础入门
    8天学通MongoDB——第六天 分片技术
    8天学通MongoDB——第五天 主从复制
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6816387.html
Copyright © 2020-2023  润新知