\hookrightarrow↪ 2.1 無解狀況html
\hookrightarrow↪ 2.2 樣例——白送的分數算法
\hookrightarrow↪ 3.1 模擬編程
\hookrightarrow↪ 3.2 萬能鑰匙——DFSwindows
\hookrightarrow↪ 4.1 聽天由命數組
\hookrightarrow↪ 4.2 猜想答案安全
\hookrightarrow↪ 4.3 尋找規律數據結構
\hookrightarrow↪ 4.4 小數據殺手——打表函數
\hookrightarrow↪ 5.1 貪心的算法學習
\hookrightarrow↪ 5.2 貪心地得分測試
\hookrightarrow↪ 6.1 快速排序
\hookrightarrow↪ 6.2 「如意金箍棒」
在Oier中,有一句話廣爲流傳:
\succ \text{任何蒟蒻必須通過大量的刷題練習才能成爲大牛乃至於神牛}\prec≻任何蒟蒻必須通過大量的刷題練習才能成爲大牛乃至於神牛≺
這就是著名的lzn定理。然而,咱們這些蒟蒻們,沒有通過那麼多歷練,卻要和大牛們同場競技,咱們該怎麼以弱勝強呢?答案就是: 騙分
那麼,騙分是什麼呢?騙分就是用簡單的程序(比標準算法簡單不少,保證蒟蒻能輕鬆搞定的程序),儘量多得騙取分數。
讓咱們走進這本《新版騙分導論》,來學習騙分的技巧,來挑戰神牛吧!
在不少題目中都有這句話:\succ \text{「若無解,請輸出-1.」}\prec≻「若無解,請輸出-1.」≺看到這句話時,騙分的蒟蒻們就欣喜若狂,由於——數據中一定會有無解的狀況!那麼,只要打出下面這個程序:
printf("-1");
就能獲得10分,甚至20分,30分!
舉個例子:
NOIP2012第4題,文化之旅 題目描述 Description 有一位使者要遊歷各國,他每到一個國家,都能學到一種文化,但他不肯意學習任何一種文化超過一次(即若是他學習了某種文化,則他就不能到達其餘有這種文化的國家)。不一樣的國家可能有相同的文化。不一樣文化的國家對其餘文化的見解不一樣,有些文化會排斥外來文化(即若是他學習了某種文化,則他不能到達排斥這種文化的其餘國家)。 現給定各個國家間的地理關係,各個國家的文化,每種文化對其餘文化的見解,以及這位使者遊歷的起點和終點(在起點和終點也會學習當地的文化),國家間的道路距離,試求從起點到終點最少需走多少路。 輸入描述 Input Description 第一行爲五個整數N,K,M,S,T,每兩個整數之間用一個空格隔開,依次表明國家個數(國家編號爲1到N),文化種數(文化編號爲1到K),道路的條數,以及起點和終點的編號(保證S不等於T); 第二行爲N個整數,每兩個整數之間用一個空格隔開,其中第i個數Ci,表示國家i的文化爲Ci。 接下來的K行,每行K個整數,每兩個整數之間用一個空格隔開,記第i行的第j個數爲aij,aij= 1表示文化i排斥外來文化j(i等於j時表示排斥相同文化的外來人),aij= 0表示不排斥(注意i排斥j並不保證j必定也排斥i)。 接下來的M行,每行三個整數u,v,d,每兩個整數之間用一個空格隔開,表示國家u與國家v有一條距離爲d的可雙向通行的道路(保證u不等於v,兩個國家之間可能有多條道路)。 輸出描述 Output Description 輸出只有一行,一個整數,表示使者從起點國家到達終點國家最少須要走的距離數
(若是無解則輸出-1)
樣例輸入 Sample Input
輸入樣例1 2 2 1 1 2 1 2 0 1 1 0 1 2 10 輸入樣例2 2 2 1 1 2 1 2 0 1 0 0 1 2 10 樣例輸出 Sample Output 輸出樣例1 -1 輸出樣例2 10 數據範圍及提示 Data Size & Hint 【輸入輸出樣例1說明】 因爲到國家2必需要通過國家1,而國家2的文明卻排斥國家1的文明,因此不可能到達國家2。 【輸入輸出樣例2說明】 路線爲1 -> 2。 【數據範圍】 對於20%的數據,有2≤N≤8,K≤5; 對於30%的數據,有2≤N≤10,K≤5; 對於50%的數據,有2≤N≤20,K≤8; 對於70%的數據,有2≤N≤100,K≤10; 對於100%的數據,有2≤N≤100,1≤K≤100,1≤M≤N2,1≤ki≤K,1≤u,v≤N,1≤d≤1000,S≠T,1 ≤S, T≤N。
這道題看起來很複雜,但其中有振奮人心的一句話「輸出-1」,我考試時就高興壞了(當時我才初一,水平太爛),隨手打了個
printf(「-1」);
,得10分。
每道題目的後面,都有一組「樣例輸入」和「樣例輸出」。它們的價值極大,不只能初步幫你檢驗程序的對錯(特別坑的樣例除外),並且,若是你不會作這道題(這種狀況蒟蒻們已經司空見慣了),你就能夠直接輸出樣例!
例如美國的USACO,它的題目有一個規則,就是第一組數據必須是樣例。那麼,只要你輸出全部的樣例,你就能獲得100分(滿分1000)!這是至關可觀的分數了。
如今,你已經掌握了最基礎的騙分技巧。只要你會基本的輸入輸出語句,你就能實現這些騙分方法。那麼,若是你有必定的基礎,請看下一章——我將教你怎樣用簡單方法騙取部分分數。
本章的標題來源於《學習雷鋒好榜樣》的一句歌詞,但我不是想教導大家學習雷鋒精神,而是學習騙分!
看到「樸素」兩個字了嗎?它們表明了一類算法,主要有模擬和DFS。下面我就來介紹它們在騙分中的應用。
所謂模擬,就是用計算機程序來模擬實際的事件。例如NOIP2012的「尋寶」,就是寫一個程序來模擬小明上藏寶塔的動做。
較繁的模擬就不叫騙分了,我這裏也不討論這個問題。
模擬主要能夠應用在騙高級數據結構題上的分,例如線段樹。下面舉一個例子來講明一下。
排 隊(USACO 2007 January Silver) 【問題描述】 天天,農夫約翰的N(1≤N≤50000)頭奶牛老是按同一順序排好隊,有一天,約翰決定讓一些牛玩一場飛盤遊戲(Ultimate Frisbee),他決定在隊列裏選擇一羣位置連續的奶牛進行比賽,爲了不比賽結果過於懸殊,要求挑出的奶牛身高不要相差太大。 約翰準備了Q(1≤Q≤200000)組奶牛選擇,並告訴你全部奶牛的身高Hi(1≤ Hi ≤106)。他想知道每組裏最高的奶牛和最矮的奶牛身高差是多少。 注意:在最大的數據上,輸入輸出將佔據大部分時間。 【輸入】 第一行,兩個用空格隔開的整數N和Q。 第2到第N+1行,每行一個整數,第i+1行表示第i頭奶牛的身高Hi 第N+2到第N+Q+1行,每行兩個用空格隔開的整數A和B,表示選擇從A到B的全部牛(1 ≤ A ≤ B ≤ N) 【輸出】 共Q行,每行一個整數,表明每一個詢問的答案。 輸入樣例 輸出樣例 6 3 1 7 3 4 2 5 1 5 4 6 2 2 6 3 0 對於這個例子,大牛們能夠寫個線段樹,而咱們蒟蒻,就模擬吧。
附模擬程序:
for(int i=1;i<=q;i++){ scanf(「%d%d」,&a,&b); int min=INT_MAX,max=INT_MIN; for(int i=a;i<=b;i++){ if(h[i]<min)min=h[i]; if(h[i]>max)max=h[i]; } printf(「%d\n」,max-min); }
程序簡潔明瞭,而且能高效騙分。本程序得50分。
DFS是圖論中的重要算法,但咱們看來,圖論神馬的都是浮雲,關鍵就是如何騙分。下面引出本書的第2條定理:
\succ \text{DFS是萬能的。}\prec≻DFS是萬能的。≺
這對於你的騙分是相當重要的。好比說,一些動態規劃題,能夠DFS;數學題,能夠DFS;剪枝的題,更能DFS。下面以一道省選題爲例,解釋一下DFS騙分。
例題:NOIP2003,採藥 題目描述 Description 辰辰是個天資聰穎的孩子,他的夢想是成爲世界上最偉大的醫師。爲此,他想拜附近最有威望的醫師爲師。醫師爲了判斷他的資質,給他出了一個難題。醫師把他帶到一個處處都是草藥的山洞裏對他說:「孩子,這個山洞裏有一些不一樣的草藥,採每一株都須要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裏,你能夠採到一些草藥。若是你是一個聰明的孩子,你應該可讓採到的草藥的總價值最大。」 若是你是辰辰,你能完成這個任務嗎? 輸入描述 Input Description 輸入第一行有兩個整數T(1<=T<=1000)和M(1<=M<=100),用一個空格隔開,T表明總共可以用來採藥的時間,M表明山洞裏的草藥的數目。接下來的M行每行包括兩個在1到100之間(包括1和100)的整數,分別表示採摘某株草藥的時間和這株草藥的價值。 輸出描述 Output Description 輸出包括一行,這一行只包含一個整數,表示在規定的時間內,能夠採到的草藥的最大總價值。 樣例輸入 Sample Input 70 3 71 100 69 1 1 2 樣例輸出 Sample Output 3 數據範圍及提示 Data Size & Hint 對於30%的數據,M<=10; 對於所有的數據,M<=100。
這題的方法很簡單。咱們瞄準20%的數據來作,能夠用DFS枚舉方案,而後模擬計算出最優解。附一個大體的代碼:
void DFS(int d,int c){ if(d==n){if(c>ans)ans=c; return;} DFS(d+1,c+w[i]); DFS(d+1,c); }
若是你以爲你的人品很好,能夠試試這一招——輸出隨機數。
先看一下代碼:
#include<stdlib.h> #include<time.h> //以上兩個頭文件必須加 srand(time(NULL)); //輸出隨機數前執行此語句 printf(「%d」,rand()%X); //輸出一個0~X-1的隨機整數。
這種方法適用於輸出一個整數(或判斷是否)的題目中,答案的範圍越小越好。讓老天決定你的得分吧。
聽說,在NOIP2013中,有人最後一題不會,憤然打了個隨機數,結果得了70分啊!!
有些時候,問題的答案可能頗有特色:對於大多數狀況,答案是同樣的。這時,騙分就該出手了。你須要作的,就是發掘出這個答案,而後直接輸出。
有時,你須要運用第3章中學到的知識,先寫出樸素算法,而後造一些數據,可能就會發現規律。
例如,本班月賽中有一道題:
炸燬計劃 【問題描述】 皇軍侵佔了通往招遠的黃金要道。爲了保護渤海通道的安全,使得黃金可以順利地運送到敵後戰略總指揮地延安,從而購買戰需武器,因此咱們要經過你的程序肯定這條戰略走廊是否安全。 已知咱們有N座小島,只有使得每個小島都能與其餘任意一個小島聯通才能保證走廊的安全。每一個小島之間只能經過若干雙向聯通的橋保持聯繫,已知有M座橋(Ai,Bi)表示第i座橋鏈接了Ai與Bi這兩座城市。 如今,敵人的藥只能炸燬其中一座橋,請問在僅僅炸燬這一座橋的狀況下,可否保證全部島嶼安全,都能聯通起來。 如今給出Q個詢問Ci,其中Ci表示橋樑編號,橋樑的編號按照輸入順序編號。每一個詢問表示在僅僅炸燬第Ci座橋的狀況下可否保證全部島嶼安全。若是能夠,在輸出文件當中,對應輸入順序輸出yes,不然輸出no(輸出爲半角英文單詞,區分大小寫,默認爲小寫,不含任何小寫符號,每行輸出一個空格,忽略文末空格)。 【輸入格式】 第一行 三個整數N,M,Q,分別表示島嶼的個數,橋樑的個數和詢問的個數。 第二行到第M+1行 每行兩個整數。第i+1行有兩個整數Ai Bi表示這個橋樑的屬性。 第M+2行 有Q個整數Ci表示查詢。 【輸出格式】 Q行,表示查詢結果。 【樣例】 destroy.in destroy.out 2 1 1 1 2 1 no 【樣例範圍】 對於80%的數據,N≤100。 對於100%的數據,N≤1000,N,Q≤M≤2000 。 你發現問題了嗎?那麼多座橋,炸一座就破壞島嶼的聯繫,可能性微乎其微(除非特別設計數據)。那麼,咱們的騙分策略就出來了:對於全部詢問,輸出yes.果真,此算法效果不錯,得80分。 如今知道猜想答案的厲害了吧? 4.3 尋找規律 首先聲明:本節講的規律不是正當的算法規律,而是數據的特色。 某些題目會給你不少樣例,你就能夠觀察他們的特色了。有時,數據中的某一個(或幾個)數,能經過簡單的關係直接算出答案。 只要你找到了規律,在不少狀況下你都能獲得可觀的分數。 這樣的題目大多出如今NOI或更高等級的比賽中,本人蒟蒻一個,就不舉例了。傳說某人去省選時專門琢磨數據的規律,結果有一題得了30分。 4.4 小數據殺手——打表 我認識一我的,他在某老師家上C語言家教,老師每講一題,他都喊一句:「打錶行嗎?」 他真的是打表的忠實粉絲。表雖然不能亂打,但仍是頗有用的。 先看一個例子:NOIP2003 棧 題目描述 Description 棧是計算機中經典的數據結構,簡單的說,棧就是限制在一端進行插入刪除操做的線性表。 棧有兩種最重要的操做,即pop(從棧頂彈出一個元素)和push(將一個元素進棧)。 棧的重要性不言自明,任何一門數據結構的課程都會介紹棧。寧寧同窗在複習棧的基本概念時,想到了一個書上沒有講過的問題,而他本身沒法給出答案,因此須要你的幫忙 寧寧考慮的是這樣一個問題:一個操做數序列,從1,2,一直到n(圖示爲1到3的狀況),棧A的深度大於n。 如今能夠進行兩種操做, 1.將一個數,從操做數序列的頭端移到棧的頭端(對應數據結構棧的push操做) 2. 將一個數,從棧的頭端移到輸出序列的尾端(對應數據結構棧的pop操做) 使用這兩種操做,由一個操做數序列就能夠獲得一系列的輸出序列,下圖所示爲由1 2 3生成序列2 3 1的過程。(原始狀態如上圖所示) 。 你的程序將對給定的n,計算並輸出由操做數序列1,2,…,n通過操做可能獲得的輸出序列的總數。 輸入描述 Input Description 輸入文件只含一個整數n(1≤n≤18) 輸出描述 Output Description 輸出文件只有一行,便可能輸出序列的總數目 樣例輸入 Sample Input 3 樣例輸出 Sample Output 5
這題看似複雜,但數據範圍過小,N<=18。因此,騙分程序就好寫了:
int a[18]={1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440,9694845,35357670,129644790,477638700}; scanf(「%d」,&n): printf(「%d」,ans[n-1]);
測試結果不言而喻,AC了。
學完這一章,你已基本掌握了騙分技巧。下面的內容涉及一點算法知識,難度有所增長。蒟蒻中的蒟蒻能夠止步於此了。
給你一堆紙幣,讓你挑一張,相信你必定會挑面值最大的。其實,這就是貪心算法。
貪心算法是個複雜的問題,但你不用管那麼多。咱們只關心騙分。給你一個問題,讓你從一些東西中選出一些,你就可使用貪心的方法,儘可能挑好的。
舉個例子:這是咱們的市隊選拔的一道題。
2. 有趣的問題 【問題描述】 2013 年的NOIP 結束後, Smart 發現本身又被題目碾壓了,內心很是地不爽,因而 暗下決心瘋狂地刷數學題目,作到天昏地暗、廢寢忘食,準備在今年的中考中大展身手。 有一天,他在作題時發現了一個有趣的問題: 給定n 個二元組(ai, bi) i),記函數: y=100\*sigma(ai)/sigma(bi); 將函數y 的值四捨五入取整。 現將n 個二元組去掉其中的k 個計算一個新的y 值(也四捨五入取整),均能知足:y <= z ,求出最小的z值。Smart 想讓你幫他一塊兒找出最小的z值。 【輸入格式】 輸入包含多組測試數據。每組測試數據第一行兩個整數:n和k;第二行爲n 個數: a1 a2 …… an;第三行爲;n 個數: b1 b2 …… bn。 輸入數據當n、k 均爲0 時結束。 【輸出格式】 對於每組測試數據輸出一行,即找出的最小的冘值。 注意:爲避免精度四捨五入出現偏差,測試點保證每一個函數值與最終結果的差值至 少爲0.001 。 【樣例】 math.in 3 1 5 0 1 5 1 6 4 2 1 2 7 9 5 6 7 9 0 0 math. out 83 100 【數據範圍】 對於40% 的數據: n≤20; 對於70% 的數據: n≤1000; 對於100% 的數據: n≤10000,ai,bi 都在int 範圍內。
這題讓人望而生畏,但咱們有貪心的手段。每一個二元組的a值是乘到答案中的,因此a越大越好,那麼只要選擇出最小的k個去掉便可。代碼就不寫了,由於這個設計到下一章的內容:排序。
此代碼得20分。
咱們已經學了不少騙分方法,但他們中的大多效率並不高,通常能騙10~20分。這不能知足咱們的貪心。
然而,咱們能夠合成騙分的程序。舉個最簡單的例子,有些含有無解狀況的題目,它們一樣有樣例。咱們能夠寫這個程序
if(是樣例)printf(樣例); else printf(「-1」);
這樣也許能變10分爲20分,甚至更多。
固然,合併騙分方法時要注意,不要重複騙同一種狀況,或漏考慮一些狀況。
大量能騙分的問題都能用此法,你們能夠試試用新方法騙2.1中的例子「文化之旅」。
\succ \text{(請P黨們跳過本章,這不是大家的福利)}\prec≻(請P黨們跳過本章,這不是大家的福利)≺
在C++中,有一個好東西,名喚STL,被萬千Oier們所崇拜,所喜好。下面讓咱們走進STL。
快速排序是一個經典算法,也是C++黨的經典福利。他們有這樣的代碼:
#include<algorithm>//這是必須的 sort(A,A+n);//對一個下標從0開始存儲,長度爲n的數組升序排序
就這麼簡單,完成了P黨一大堆代碼乾的事情。
C++裏有一種東西,叫vector容器。它比如如意金箍棒,能夠隨着元素的數量而改變大小。它其實就是數組,卻比數組強得多。
下面看看它的幾種操做:
vector<int> V;//定義 V.push_back(x);//末尾增長一個元素x V.pop_back();//末尾刪除一個元素 V.size();//返回容器中的元素個數
它一樣可使用下標訪問。(從0開始)
至此,我已介紹完了我所知的騙分方法。若是上面的方法都不奏效,我也無能爲力。可是,我還有最後一招——
有句古話說:「寧爲玉碎,不爲瓦全」。咱們蒟蒻也應有這樣的精神。騙不到分,就報復一下,卡評測以泄憤吧!
卡評測主要有兩種方法:一是死循環,故意超時;二是進入終端,卡住編譯器。
先介紹下第一種。代碼很簡單,請看:
while(1);
就是這短短一句話,就能卡住評測機長達10s,20s,甚至更多!對於測試點多、時限長的題目,這是個不錯的方法。
第二種方法也很簡單,但危害性較大,建議不要在重要比賽中使用,不然可能讓你追悔莫及。它就是:
#include<con> //(windows系統中使用) //或 #include</dev/console> //(Linux系統中使用)
它很是強大,能夠卡住評測系統,使其永遠中止不了編譯你的程序。惟一的解除方法是,工做人員強行關機,重啓,重測。固然,我不保證他們不會氣憤地把你的成績變成0分。請慎用此方法。
下面咱們來作一些習題,練習騙分技巧。
咱們來一塊兒分析一下NOIP2013普及組的試題吧。
記數問題(NOIP普及組2013第一題) (count.cpp/c/pas) 描述 試計算在區間 1 到 n 的全部整數中,數字 x(0 ≤ x ≤ 9)共出現了多少次?例如,在 1 到 11 中,即在 一、二、三、四、五、六、七、八、九、十、11 中,數字 1 出現了 4 次。 【輸入】 輸入文件名爲 count.in。 輸入共 1 行,包含 2 個整數 n、x,之間用一個空格隔開 【輸出】 輸出文件名爲 count.out。 輸出共 1 行,包含一個整數,表示 x 出現的次數。 【輸入輸出樣例】 count.in count.out 11 1 4 限制 每一個測試點1s。 【數聽說明】 對於 100%的數據,1≤ n ≤ 1,000,000,0 ≤ x ≤ 9。 表達式求值(noip2013普及組第二題) (expr.cpp/c/pas) 描述 給定一個只包含加法和乘法的算術表達式,請你編程計算表達式的值。 【輸入】 輸入文件爲 expr.in。 輸入僅有一行,爲須要你計算的表達式,表達式中只包含數字、加法運算符「+」和乘 ,且沒有括號,全部參與運算的數字均爲 0 到 231-1 之間的整數。輸入數據保 法運算符「\*」 證這一行只有 0~ 九、+、\*這 12 種字符。 【輸出】 輸出文件名爲 expr.out。 輸出只有一行,包含一個整數,表示這個表達式的值。注意:當答案長度多於 4 位時, 請只輸出最後 4 位,前導 0 不輸出。 【輸入輸出樣例 1】 expr.in expr.out 1+1\*3+4 8 【輸入輸出樣例 2】 expr.in expr.out 1+1234567890\*1 7891 【輸入輸出樣例 3】 expr.in expr.out 1+1000000003\*1 4 【輸入輸出樣例說明】 樣例 1 計算的結果爲 8,直接輸出 8。 樣例 2 計算的結果爲 1234567891,輸出後 4 位,即 7891。 樣例 3 計算的結果爲 1000000004,輸出後 4 位,即 4。 【數據範圍】 對於 30%的數據,0≤表達式中加法運算符和乘法運算符的總數≤100; 對於 80%的數據,0≤表達式中加法運算符和乘法運算符的總數≤1000; 對於 100%的數據,0≤表達式中加法運算符和乘法運算符的總數≤100000。 小朋友的數字(noip2013普及組第三題)(number.cpp/c/pas) 描述 有 n 個小朋友排成一列。每一個小朋友手上都有一個數字,這個數字可正可負。規定每一個小朋友的特徵值等於排在他前面(包括他本人)的小朋友中連續若干個(最少有一個)小朋友手上的數字之和的最大值。 做爲這些小朋友的老師,你須要給每一個小朋友一個分數,分數是這樣規定的:第一個小朋友的分數是他的特徵值,其它小朋友的分數爲排在他前面的全部小朋友中(不包括他本人),小朋友分數加上其特徵值的最大值。 請計算全部小朋友分數的最大值,輸出時保持最大值的符號,將其絕對值對 p 取模後輸出。 格式 【輸入】 輸入文件爲 number.in。 第一行包含兩個正整數 n、p,之間用一個空格隔開。 第二行包含 n 個數,每兩個整數之間用一個空格隔開,表示每一個小朋友手上的數字。 【輸出】 輸出文件名爲 number.out。 輸出只有一行,包含一個整數,表示最大分數對 p 取模的結果。 【輸入輸出樣例 1】 number.in number.out 5 997 21 1 2 3 4 5 【輸入輸出樣例說明】 小朋友的特徵值分別爲 一、三、六、十、15,分數分別爲 一、二、五、十一、21,最大值 21 對 997 的模是 21。 【輸入輸出樣例 2】 第2/4頁 number.in number.out 5 7 -1 -1 -1 -1 -1 -1 【輸入輸出樣例說明】 小朋友的特徵值分別爲-一、-一、-一、-一、-1,分數分別爲-一、-二、-二、-二、-2,最大值 -1 對 7 的模爲-1,輸出-1。 【數據範圍】 對於 50%的數據,1 ≤ n ≤ 1,000,1 ≤ p ≤ 1,000全部數字的絕對值不超過 1000; 99 對於 100%的數據,1 ≤ n ≤ 1,000,000, 1≤ p ≤ 10, 其餘數字的絕對值均不超過 10。 車站分級(NOIP普及組2013第四題)(level.cpp/c/pas) 描述 一條單向的鐵路線上,依次有編號爲 1, 2, ..., n 的 n 個火車站。每一個火車站都有一個級別,最低爲 1 級。現有若干趟車次在這條線路上行駛,每一趟都知足以下要求:若是這趟車次停靠了火車站 x,則始發站、終點站之間全部級別大於等於火車站 x 的都必須停靠。 (注意:起始站和終點站天然也算做事先已知須要停靠的站點) 例如,下表是 5 趟車次的運行狀況。其中,前 4 趟車次均知足要求,而第 5 趟車次因爲停靠了 3 號火車站(2 級)卻未停靠途經的 6 號火車站(亦爲 2 級)而不知足要求。 現有 m 趟車次的運行狀況(所有知足要求) ,試推算這 n 個火車站至少分爲幾個不一樣的 級別。 【輸入】 輸入文件爲 level.in。 第一行包含 2 個正整數 n, m,用一個空格隔開。 第 i + 1 行(1 ≤ i ≤ m)中,首先是一個正整數 si(2 ≤ si ≤ n),表示第 i 趟車次有 si 個停 靠站;接下來有 si 個正整數,表示全部停靠站的編號,從小到大排列。每兩個數之間用一個 空格隔開。輸入保證全部的車次都知足要求。 【輸出】 輸出文件爲 level.out。 輸出只有一行,包含一個正整數,即 n 個火車站最少劃分的級別數。 第3/4頁 【輸入輸出樣例】 【數據範圍】 對於 20%的數據,1 ≤ n, m ≤ 10; 對於 50%的數據,1 ≤ n, m ≤ 100; 對於 100%的數據,1 ≤ n, m ≤ 1000。
第1題,太弱了,不用騙,得100分。
第2題,數據很大,可是能夠直接輸入一個數,輸出它mod 10000的值。得10分。
第3題,是一道很是基礎的DP,但對於不知DP爲什麼物的蒟蒻來講,就使用暴力算法(即DFS)。得20分。
第4題,咱們能夠尋找一下數據的規律,你會發現,在全部樣例中,M值即爲答案。因此直接輸出M,得10分。
這樣下來,一共得140分,比一等分數線還高20分!你的信心必定會獲得鼓舞的。這就是騙分的神奇。