当前位置:编程学习 > C/C++ >>

Timus 1981. Parallel and Perpendicular

1981. Parallel and Perpendicular
Time limit: 0.5 second
Memory limit: 64 MB
You are given a regular n-gon. Your task is to calculate two values: the number of its diagonals that are parallel to at least one of its other diagonals, and the number of its diagonals that are perpendicular to at least one of its diagonals. A diagonal is a segment connecting two non-adjacent polygon vertices.
Input
The only line contains an integer n (4 ≤ n ≤ 105).
Output
Output two required numbers.
Sample
input output
4
0 2
Problem Author: Grigory Nazarov
Tags: none  ( hide tags for unsolved problems )
 
 
题目大意:题目意思很简单,给你正n边形,n>=4,问你有多少条存在平行对角线的对角线,有多少条存在垂直于对角线的平行线。比赛的时候太累了,当时也有点事情,就没往下推,后来竟然发现是忘记把n=6的情况拿出来讨论了。QAQ。。
 
解题思路:也不知道当时自己是怎么画的图,反正n=6的情况也求成了9 9,但是今天又画了一下,竟然是6 9 比赛的时候把是这样考虑的,4 5的情况拿出来讨论。。然后n是偶数的话,分两种情况算,一种是与顶点成对称轴那条线平行的,这样的情况是(n/2)*((n-2)/2),因为去掉上下两个点,其它组成平行的就是(n-2)/2,然后*n/2是因为有n个顶点,不过没条线都会算重复一遍。另一种情况是与相邻两顶点形成的线平行的情况,这样去掉最上面两点,去掉最下面两个点,就是(n/2)*((n-4)/2)。两个加起来就是偶数的情况。偶数的情况垂直与平行条数相等,由于对称。 n为奇数的时候,从一个点作(n-3)条对角线,发现这么多条,要么和上面说的第一种情况点平行,要么就是第二种情况与线平行。而且这样条数就是(n-3)*n/2,除以2是因为每条对角线重复算了一次。 
 
题目地址:1981. Parallel and Perpendicular
 
这是当时比赛的思路,可以A掉。
这是少讨论了6啊。TAT!!!
代码:
[cpp]  
#include<iostream>  
#include<cstring>  
#include<string>  
#include<cmath>  
#include<cstdio>  
#include<algorithm>  
using namespace std;  
  
int main()  
{  
    long long n;  
    while(~scanf("%lld",&n))  
    {  
        long long a,b;  
        if(n==4) cout<<"0 2"<<endl;  
        else if(n==5) cout<<"0 0"<<endl;  
        else if(n==6) cout<<"6 9"<<endl;  //有三根是不存在平行,只有垂直的  
        else  
        {  
            if(!(n&1))  
            {  
                a=(n/2)*((n-2)/2);   //与点平行的  
                a+=(n/2)*((n-4)/2);  //与边平行的  
                b=a;  
            }  
            else  
            {  
                a=n*(n-3)/2;  
                b=0;  
            }  
            printf("%lld %lld\n",a,b);  
        }  
    }  
    return 0;  
}  
 
 
后来仔细想了下,原来两种情况原来是一样的,偶数的时候奇数的时候都是求得所有的对角线,当时怎么就没发现,确实是这样,每条对角线都会有平行的,如果是偶数,每条对角线有垂直的。当时没有多想。。
AC代码:
[cpp]  
#include<iostream>  
#include<cstring>  
#include<string>  
#include<cmath>  
#include<cstdio>  
#include<algorithm>  
using namespace std;  
  
int main()  
{  
    long long n;  
    while(~scanf("%lld",&n))  
    {  
        long long a,b;  
        if(n==4) cout<<"0 2"<<endl;  
        else if(n==5) cout<<"0 0"<<endl;  
        else if(n==6) cout<<"6 9"<<endl;  //有三根是不存在平行,只有垂直的  
        else  
        {  
            a=n*(n-3)/2;   //所有对角线的条数  
            b=0;  
            if(!(n&1)) b=a;  
            printf("%lld %lld\n",a,b);  
        }  
    }  
    return 0;  
}  
 
当时察觉出来了6有点奇怪,因为中间的对角线没有平行的,短路了。。
 
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,