先說一下解題過程:
爆破肯定不行,題目結尾也給出了。那只能考慮別的思路。由題目中的輸入輸出格式(都是線段)我們可以想到:輸入中的線段端點與輸出中的線段端點有關係,可以以此為突破口。
我首先假設的是,推論一: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,要保證素數...