POJ 1009 解題報告

2022-08-30 22:12:21 字數 2713 閱讀 9964

先說一下解題過程:

爆破肯定不行,題目結尾也給出了。那只能考慮別的思路。由題目中的輸入輸出格式(都是線段)我們可以想到:輸入中的線段端點與輸出中的線段端點有關係,可以以此為突破口。

我首先假設的是,推論一:output線段起點一定在input線段端點(起點和終點)的九宮格覆蓋內(這裡的覆蓋可以迴繞,即跨行,見下圖,圖中綠色方格能夠覆蓋所有紅色標記的方格)

後來經過驗證,發現乙個更嚴格的條件,推論2,除了左下角以外的所有output線段起點,都在input線段起點的九宮格覆蓋內

。以下對一般情況進行證明(其他邊界或者特殊情況類似,不再贅述):

1. 考慮除了左下角以外的所有output線段起點:

反證法:考慮除了左下角以外的所有output線段起點,假設存在乙個起點不在input線段起點的九宮格覆蓋內,那麼在input中肯定是下面的情況:

綠色點為output線段起點,由於該圖中沒有起點,所以圖中同一行元素只能是相同的。由於第一列的元素肯定都不是起點,即前面肯定還有相同的點,即下圖:

此時黃色點和綠色點,在output中的值一樣,所以綠色點肯定不是output中的線段起點,與假設矛盾。

注意:如果沒有那麼多列,可以進行迴繞來得到上圖,對於上下邊界情況,是殘缺的九宮格,但結論是一樣的,感興趣的可以證明一下。

2. 左下角為output起點的情況,看下圖:

在上圖中我標出了綠色點的九宮格(回環後的),可以看出綠色點並不在某個input起點的覆蓋內,但它確實是乙個起點(與上圖中的黃色字型所在格的output值不同)。

上面的推論一和推論二都是正確的,注意假設二中的左下角在右下角的的回環覆蓋內的,所以也是正確的,下面是**,使用推論二:

#include #include 

#include

#include

#define pi 3.14159265359

int resset[9001][2], setcnt; //

0 表示1維索引, 1 顏色

int pair[1001][3]; //

0 value, 1 count, 2 accumulated count

intw, h, pairs, pixels;

int end[1001], numend; //

輸入端點的1維索引

int cmp_func(const

void *a, const

void *b)

//bi-section search

int getvalue(int

idx)

return pair[start][0];}

//int getvalue(int idx)

////

}int

main()

, , , , , , , , };

while(1

)

pixels += pair[i][1

];

if(0 ==i)

else

numend++;

//if(pair[i][1] > 1)

//最初ac用的推論

//}h = pixels /w;

//找出輸出影象中所有的可能的端點

for(int i = 0; i < numend; i++)

}//左下角

resset[setcnt][0] = (h-1)*w;

resset[setcnt++][1] = 0

;

for(int i = 0; i < setcnt; i++)

resset[i][

1] =maxdiff;

}//sort

qsort(resset, setcnt, 2 * sizeof(int

), cmp_func);

resset[setcnt][

0] = pixels; //

sentinel

resset[setcnt][1] = -1

; printf(

"%d\n

", w);

for(int i = 0; i < setcnt; i++)

printf(

"0 0\n");

}printf(

"0\n");

return0;

}

poj解題報告 1328

不得不說,這題是讓我飽受折磨,畢竟第一次做貪心演算法,而且wa了好多次,幸好有學長的幫助,最終找到了問題所在,是在快排上是問題,double高位不可向int低位轉換,由於一開始強制轉換導致雖然樣例和其他的測試資料過了,但還是wa,現在改完了就對了,附上ac ps 這題通過率是22 真心不簡單 如下 ...

poj解題報告 2586

這題我是用的貪心演算法,其實不用也可以,列舉也能解決,因為情況不多。因為是每連續5個月必有虧損,而一年只有1 5,2 6,3 7,4 8 8 12共8種情況。現在設盈餘為s,虧損為d,可列出以下幾種情況。ssssdssssdss 4ssssddsssddss 3s 2d ssdddssdddss 2...

poj解題報告 2635

這題特別好理解,就是 坑啊。題意就是給乙個數,這個數是兩個大素數的積,再給出乙個數,如果最小的素數比給的數大,列印good,否則列印bad和最小的素數。這題用的方法是高精度求模 同餘模定理。還有素數打表,把10 6內的素數全部預打表,在求模時則列舉到小於l為止。注意打表不能只打到100w,要保證素數...