題意
我過的是比較幸運的。首先我用一個二維數(shù)組f[][]存下某些狀態(tài),其中f[i][j]表示長度為i,1的個數(shù)不超過j的數(shù)目。然后如果某個數(shù)小于2^L,那么肯定輸出原數(shù),如果不是再特殊處理,找到第一個f[i][L]比I大的i。然后比較I和f[i][L],f[i-1][L]其中哪個近,離哪個近就從那邊開始搜。一直搜到結(jié)果為止,這樣能過,但是險過。有一組數(shù)據(jù)用時0.9+S。其中還有一些要注意的就是用long long。也就是如果測試數(shù)據(jù)有31 31的話,不用long long 會超數(shù)據(jù)范圍。(我大致算了下,我這種寫法,極限數(shù)據(jù)應(yīng)該會超過1S,那樣的話必掛無疑。但是好像usaco的數(shù)據(jù)沒這種)
官方的:首先也是處理一個和我的一樣的二維數(shù)組。不過后面明顯比我的要好,標(biāo)稱是用遞歸寫的,直接輸出。
void printbits(int nbits, int nones, double index)
{/*nbits 表示剩下的要處理的長度 nones 表示剩下的1的個數(shù) index表示第多少個*/
double s;
if(nbits == 0)/*處理完成*/
return;
s = sizeofset[nbits-1][nones];/*得到f[bits-1][nones]*/
if(s <= index)
{/*如果index大于這個f值*/
fprintf(fout, "1");/*那么這位肯定是1 */
printbits(nbits-1, nones-1, index-s);/*改變相應(yīng)的狀態(tài) 繼續(xù)輸出 長度-1,1的個數(shù)-1 index-s 這里這個index-s有點像10進制化2進制*/
}
else
{
fprintf(fout, "0"); /*小于這個f值這位肯定為0*/
printbits(nbits-1, nones, index);/*改變相應(yīng)的狀態(tài)繼續(xù)輸出 長度-1 1的個數(shù)不減 index也不變*/
}
}
還是修煉不夠啊。。。。