題意

   我過的是比較幸運的。首先我用一個二維數組f[][]存下某些狀態,其中f[i][j]表示長度為i,1的個數不超過j的數目。然后如果某個數小于2^L,那么肯定輸出原數,如果不是再特殊處理,找到第一個f[i][L]比I大的i。然后比較I和f[i][L],f[i-1][L]其中哪個近,離哪個近就從那邊開始搜。一直搜到結果為止,這樣能過,但是險過。有一組數據用時0.9+S。其中還有一些要注意的就是用long long。也就是如果測試數據有31 31的話,不用long long 會超數據范圍。(我大致算了下,我這種寫法,極限數據應該會超過1S,那樣的話必掛無疑。但是好像usaco的數據沒這種)

   官方的:首先也是處理一個和我的一樣的二維數組。不過后面明顯比我的要好,標稱是用遞歸寫的,直接輸出。

void printbits(int nbits, int nones, double index)

   {/*nbits 表示剩下的要處理的長度  nones 表示剩下的1的個數  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);/*改變相應的狀態 繼續輸出  長度-1,1的個數-1 index-s 這里這個index-s有點像10進制化2進制*/   

        } 

      else

        {  

          fprintf(fout, "0"); /*小于這個f值這位肯定為0*/ 

          printbits(nbits-1, nones, index);/*改變相應的狀態繼續輸出  長度-1 1的個數不減 index也不變*/

        }

   }

還是修煉不夠啊。。。。