題意:嵌套娃娃,在裡層的娃娃的尺寸要小於外層的娃娃,有可能一個娃娃裡面有多個娃娃,而這多個娃娃尺寸和要小於外層的,相當與匹配括弧的加強版,有些但疼。
思路:要多容量大小是否足夠的判斷,小看了別人的一些思路,自己寫了代碼。下面的核心代碼是deal函數,用的是錯位的方法(個人覺得),同一top的sum[top]和stack[top],其實是sum[top]是在stack[top]內層的容量,比如-5 -3 3 5,sum[0] = 5,stack[1] = -5,sum[1] = 3,stack[2] = -3。這樣就可以判斷是否有足夠的容量裝多個娃娃。(感覺還是有點抽象的樣子,自己在草稿紙上寫寫就會明白了。。。)
#include<stdio.h> #include<string.h>#include<math.h>#include<algorithm>using namespace std;#define N 1000000int arr[N], stack[N], sum[N];int deal(int *a, int n) {int top = 0;memset(stack, 0, sizeof(stack));memset(sum, 0, sizeof(sum));哦for(int i = 0; i < n; i++){if(a[i] < 0) { sum[top] -= a[i];//記錄每一層的容量 } else { if(-stack[top] != a[i])//判斷正數是否與棧頂的元素和為0return 0; if(sum[top] >= a[i])//每一個進行判斷的正數,要求要比內層的容量大return 0; stack[top] = 0;//元素出棧sum[top--] = 0;//當元素出棧時,其相應的容量要清零}}return 1;}int main() {int cnt = 0;char ch;while (scanf("%d", &arr[cnt++]) != EOF) {int flag = 0;ch = getchar();if (ch == '\n') {if (cnt % 2 == 1)flag = 0;elseflag = deal(arr, cnt);if (flag)printf(":-) Matrioshka!\n");elseprintf(":-( Try again.\n");cnt = 0;}}return 0;}