HDU2280 Adding Edges

  题目的意思求标号为1的点的最小可能的度,即在满足给定的条件下,如何连线能够使得连到1上的边尽可能的小。

  由于题中要求  ① degree(i) != degree(j), (i != j, 1 <= i, j <= N).   所以每个点的度一定会是 1,2,3,4 ... N 分布,产生一个度为N的点,那么该点就要与其余N - 1个点以及标号为 “A”的点相连,一次这样的操作后,假设该次选择的点为X,那么N个点中除了 度为N的 X点,度为 1的与 X 相对的点 外,其余所有点的度均为 2,此时我们要选取出度为N-1的点,由于度为1的点(仅存的度为1的点)不能够改变它,所以下一步要在度为2的点中选取一个点添加到同为度为2的 N - 3个点的连线,这时又会产生度为 3 和 度为 N - 1的一对点,一直进行下去,由于“A”点不能够占用度数,所以1也就留到了最后才来连,这样产生的才是合法的,同时这个时候1的度也是最小的,为 ( N + 1 )/ 2。

  代码如下:

#include <cstdlib>
#include
<cstring>
#include
<cstdio>
using namespace std;

void getint( int &t )
{
char c;
while( c = getchar(), c < '0' || c > '9' ) ;
t
= c - '0';
while( c = getchar(), c >= '0'&& c <= '9' )
{
t
= t * 10 + c - '0';
}
}

int main()
{
int N;
while( getint( N ), N )
{
printf(
"%d\n", ( N + 1 ) >> 1 );
}
return 0;
}

  

原文地址:https://www.cnblogs.com/Lyush/p/2155509.html