Code

2018年1月28日 星期日

UVA 11572 Unique Snowflakes

題目求最大的不連續數量
設一個陣列記錄每一次輸入值的位置
再設一個基準值在每一次重複後,更新為前面重複值的後一位,亦即陣列記錄值加一
基準值存在意義為,每一次重複後,前面重複值以前的數均不考慮
故新輸入值所對應的陣列值需大於等於基準值,才能算重複
而每一次重複後都要計算當前的長度,記錄在ans陣列
另外,必須考慮沒有重複的情況,以count紀錄
而每一次重複後,count的值也會更新
#include <stdio.h>
#define MAX 1000005

int main(int argc, const char * argv[]) {

    int case_number, n, test;

    while (scanf("%d", &case_number) != EOF) {

        while (case_number--) {

            int i, j = 0;

            int left = 1, count = 0, table[MAX] = {0}, ans[MAX] = {0}, result = 0;
            /*left紀錄基準線,count計算不重複的情況,
            table是對照表,ans是每一次的答案,result取最大的ans值*/
            scanf("%d", &n);

            for (i = 1; i <= n; i++) {

                scanf("%d", &test);

                if (table[test] >= left){  //大於等於不重複的基準線,即重複
                    ans[j++] = i - left;   //紀錄答案
                    left = table[test] + 1;  //調整基準線
                    count = i - table[test];  //記錄之後連續狀況的count亦要重新計算
                }

                else
                    count++;  // 沒重複 直接加

                table[test] = i; //更新table的值
            }

            if (count) //這個情況紀錄的是 從上一次重複(或不曾重複)到結束都沒有重複
                ans[j] = count;

            for (i = 0; ans[i]; i++) {  //找最大
                if (ans[i] > result)
                    result = ans[i];
            }

            printf("%d\n", result);
        }
    }
    return 0;
}

沒有留言:

張貼留言