[洛谷]P1416 攻擊火星 (#數學 -1.13)
阿新 • • 發佈:2018-12-16
題目描述
一群外星人將要攻擊火星。
火星的地圖是一個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;
}