杭電4272 Lianliankan dfs和map的使用
I like playing game with my friend, although sometimes looks pretty naive. Today I invent a new game called LianLianKan. The game is about playing on a number stack.
Now we have a number stack, and we should link and pop the same element pairs from top to bottom. Each time, you can just link the top element with one same-value element. After pop them from stack, all left elements will fall down. Although the game seems to be interesting, it's really naive indeed.
To prove I am a wisdom among my friend, I add an additional rule to the game: for each top element, it can just link with the same-value element whose distance is less than 6 with it.
Before the game, I want to check whether I have a solution to pop all elements in the stack.
Input
There are multiple test cases.
The first line is an integer N indicating the number of elements in the stack initially. (1 <= N <= 1000)
The next line contains N integer ai indicating the elements from bottom to top. (0 <= ai <= 2,000,000,000)
Output
For each test case, output “1” if I can pop all elements; otherwise output “0”.
Sample Input
2
1 1
3
1 1 1
2
1000000 1
Sample Output
1
0
0
題意分析:本題大意是給你一個棧,棧裡面有有一些數,現從棧頂開始在5個範圍內,找有沒有相同的數,如有相同則消去這兩個數,依次重複 ,如果最後沒有數則輸出1,反之則輸出0.
本題可以用dfs外加map來做,程式碼如下(借鑑了飄哥的程式碼)
#include <iostream> #include <cstdio> #include <map> #include <cstring> using namespace std; map<int ,int> m; int a[1100]; int vis[1100]; int dfs(int n) { while(n && vis[n]) n--; if(n <= 0) return 1; if(n == 1) return 0; int i=0, j = n-1; for(;i<=5;) { if(j <= 0) return 0; if(vis[j]){ j--; continue; } if(a[n] == a[j]) { vis[j] = 1; if(dfs(n-1)) return 1; vis[j] = 0; } i++; j--; } return 0; } int main() { int n; while(scanf("%d",&n)!=EOF) { m.clear(); memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); vis[i] = 0; m[a[i]]++; } if(n & 1) { printf("0\n"); continue; } int flag = 1; map<int ,int>::iterator it; for(it = m.begin();it != m.end();it++) { if(it->second % 2==1) { flag = 0; break; } } if(flag == 0){ printf("0\n"); continue; } printf("%d\n",dfs(n)); } return 0; }
當然本題用另外一種方法也能過,但原理不對(能過是因為杭電資料太水),借鑑了羅明俊俊哥的程式碼:
#include <cstdio> using namespace std; int main(){ int n, v, ans, cnt; while(scanf("%d", &n) != EOF){ ans = cnt = 0; for(int i = 0; i < n; i++){ scanf("%d", &v); ans ^= v; if(v == 0) cnt++; } if(ans == 0) printf("1\n"); else printf("0\n"); } return 0; }
過不了這組資料:
12
1 3 3 5 5 4 4 1 2 6 6 2
但是他所用的方法很值得我們借鑑(異或的自反性),實質上是nim博弈思想的體現。
相關推薦
杭電4272 Lianliankan dfs和map的使用
Problem Description I like playing game with my friend, although sometimes looks pretty naive. Today I invent a new game called LianLianK
杭電1016(dfs)增所廣收
</pre><div class="panel_content" style="height: auto; margin: 0px; padding: 0px 20px; font-size: 14px; font-family: 'Times New R
杭電2018多校第四場(2018 Multi-University Training Contest 4) 1005.Problem E. Matrix from Arrays (HDU6336) -子矩陣求和-規律+二維前綴和
main turn 輸出 求和 targe blog 技術分享 tle pre 6336.Problem E. Matrix from Arrays 不想解釋了,直接官方題解: 隊友寫了博客,我是水的他的代碼 ------>HDU 6336 子矩陣求和
2018杭電多校第二場1003(DFS,歐拉回路)
歐拉路 style ear bits its space nbsp 記錄 一個隊列 #include<bits/stdc++.h>using namespace std;int n,m;int x,y;int num,cnt;int degree[100007]
杭電acm 1181 變形課 DFS
小寫 pty space ring 隊列 set amp ott panel 變形課 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Subm
杭電1010--Tempter of the Bone(DFS+奇偶剪枝)
【題目描述】 就是類似於迷宮問題,給出出發點、終點、限定時間(不能早到或者晚到)、牆壁。走過的地方不能再走,求能否在指定時間到達。 【分析】 很標準的DFS題,但是程式碼提交上去不是TLE就是WA了,學習了一下其他人的程式碼,發現自己的問題如下: 起點沒有設定為1,這導致了小狗可
分拆素數和(杭電2098)
Problem Description 把一個偶數拆成兩個不同素數的和,有幾種拆法呢? Input 輸入包含一些正的偶數,其值不會超過10000,個數不會超過500,若遇0,則結束。 Output 對應每個偶數,輸出其拆成不同素數的個數,每個結果佔一行。 Sample
杭電acm 4414 Finding Crosses dfs的運用
題目傳送 解題思路:本題大意是給你一張n*n的圖,圖中有由'#'組成的十字架,現在讓你算算該圖中共有多少個十字架,十字架是有限制的,首先,需要‘#’個數是技術,且四個方向的‘#’相同,其次兩邊不能有‘#’,故只能沿四個方向深搜。 圖中紅筆區域不能有‘#’。 程式碼1:四個
杭電ACM OJ 1019 Least Common Multiple 質因子最快速求最大公因數和最小公倍數
Least Common Multiple Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 56268
杭電acm2040:親和數(兩整數真約數和互等)
開始沒明白真約數是啥- -!賊簡單。 #include <iostream> using namespace std; int find_sum(int& n){ int
杭電ACM2007--平方和與立方和
平方和與立方和 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 231385 &nbs
杭電ACM2009--求數列的和
求數列的和 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 114175
杭電acm 1241Oil Deposits(dfs搜尋入門題)
Oil Deposits Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 1 Accepted Submi
杭電1002解答疑問求解(附對和錯的C++程式碼)
這裡是ACM機器編譯不通過的程式碼,求指教為何錯誤了??VC++6.0執行成功<pre class="cpp" name="code">#include <iostream> #include<string> using namespac
杭電初試複試複習經驗(來自於18專碩狀元和專業課最高分學長)
以下經驗為18屆杭電學長群體整理,包括專碩狀元柏大佬、專業課第一裘大佬以及渣渣博主和粉紅豬大佬 目錄 初試經驗: 數學: 英語: 政治 專業課 複試經驗 初試經驗: 數學: 先說數學吧,數學當時用了張宇十八講和李永樂複習全書兩本,
杭電oj 求數列的和
i++ 杭電oj lib tom 平方根 整數 () ali stdlib.h Problem Description 數列的定義如下:數列的第一項為n,以後各項為前一項的平方根,求數列的前m項的和。 Input 輸入數據有多組,每組占一行,由兩個整數n(
杭電1170
簡單 == while tail pan 分代 out set 初始 就是個簡單的if else判斷功能的水題目 思路 :就是讀取、計算、利用判斷語句 難點:我在做的時候判斷是否是浮點小數那邊出了點問題,因為我初始設置是double 所以輸出的時候我強制類型轉化為int 這
杭電2018母牛的故事
處理 代碼 [1] out ++ program clas desc col program description 有一頭母牛,它每年年初生一頭小母牛。每頭小母牛從第四個年頭開始,每年年初也生一頭小母牛。請編程實現在第n年的時候,共有多少頭母牛? input 輸入數據
杭電1024----Max Sum Plus Plus
int oid max art main 杭電 sca ava 最大 1 /* 2 這題還沒有理解透徹。某個dalao也不寫註釋。只能自己理解了。。。 3 先求為i個元素(1<=i<=M)為一個區間的最大和,保證元素個數大於等於i個,遞推到M個即可 4
杭電2016數列有序
break col iostream ios 空格 討論 pan include span #include<iostream>using namespace std;int main(){ int n,m,t = 0; int a[110], b[11