1. 程式人生 > >[洛谷]P1416 攻擊火星 (#數學 -1.13)

[洛谷]P1416 攻擊火星 (#數學 -1.13)

題目描述

一群外星人將要攻擊火星。

火星的地圖是一個n個點的無向圖。這夥外星人將按照如下方法入侵,先攻擊度為0的點(相當於從圖中刪除掉它),然後是度為1的點,依此類推直到度為n-1的點。

所有的點度統計是動態統計的。(一個點刪掉後,與之相連的點的點度都會-1)。外星人攻擊度為某個數的點時是同時攻擊的。

你需要設計這個圖的邊的方案來使得未被攻擊的點最多。

輸入輸出格式

輸入格式:

輸入檔案包含一行一個整數n。

輸出格式:

一行一個整數,表示最多的最後未被攻擊的點。

輸入輸出樣例

輸入樣例#1

3

輸出樣例#1

1

說明

【樣例解釋】

①-②-③,這樣首先刪掉度為1的①和③,此時②度數為0,不會被刪去。

【資料範圍】

對於20%的資料1<=n<=10

對於100%的資料1<=n<=50000

思路

kkksc03的題解:

經過找規律可以發現答案為n-2.  以下是證明:  令d[i]為i 的度數。  考慮一個點i 不被刪去的條件,必然是前面與i 相鄰的點j(可以是多個)被刪去,導致d[i]  減小至小於等於d[j].  1)易知ans!=n。  2)考慮ans能否是n-1,也就是隻刪一個點,設這個點為i。  因為i 是唯一被刪去的點,所以d[i]一定不是最大的,即d[i] < n-1。  其次刪去i 導致其餘點的d[]均發生改變,從而無法被刪去。  即i 和其餘點都相連,d[i]=n-1,矛盾。  所以ans!=n-1.  3)我們可以構造出ans=n-2的情況:  構造完全圖G,刪去一條邊(i,j)。這樣d[i]=d[j]=n-2,其餘d[]均為n-1.  首先刪去VI,Vj,這樣其餘點各少兩條邊,d[]均變成n-3,不用被刪去。  由此n-2是合法的解,也是最大的解,所以答案就是n-2.

一開始真沒想到是數學。

#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n;
	cin>>n;
	if(n<=2)
	{
		cout<<0<<endl;
	}
	else
	{
		cout<<n-2<<endl;
	}
	return 0;
}