1. 程式人生 > >杭電4272 Lianliankan dfs和map的使用

杭電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 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 dfsmap的使用

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