查看: 2234|回復: 0
打印 上一主題 下一主題

[ZJ] a828 - 間隔數 ( number )

[複製鏈接]
  • TA的每日心情
    慵懶
    2015-4-10 14:18
  • 簽到天數: 78 天

    [LV.6]常住居民II

    176

    主題

    612

    帖子

    3959

    積分

    管理員

    Rank: 9Rank: 9Rank: 9

    積分
    3959

    台南一中資訊社新手達陣程式設計達人 - 2014

    跳轉到指定樓層
    樓主
    發表於 2014-6-24 08:12:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

    趕快加入我們來參與討論吧!

    您需要 登錄 才可以下載或查看,沒有帳號?加入我們

    x
    原題:http://zerojudge.tw/ShowProblem?problemid=a828
    AC:http://zerojudge.tw/Submissions?problemid=a828&account=lfs92002

    可以發現一個二位數反覆的長度能決定一個間隔數列,可以推出長度為N的間隔數恰有81個,就可以移此類推求出第N個間隔數


    ACCODE
    @code
  • /**********************************************************************************/
  • /*  Problem: a828 "間隔數 ( number )" from 102北市賽                        */
  • /*  Language: CPP (502 Bytes)                                                     */
  • /*  Result: AC(24ms, 236KB) judge by this@ZeroJudge                               */
  • /*  Author: lfs92002 at 2014-06-23 21:11:00                                       */
  • /**********************************************************************************/


  • #include<cstdio>
  • using namespace std;
  • inline void put_min_int(int i)
  • {
  •     int e=i/10;
  •     if(e!=0){
  •         putchar('0'+e);
  •         i-=e*10;
  •     }
  •     putchar('0'+i);
  • }
  • int main()
  • {
  •     int n,p,q,i,j,k,o;
  •     int tab[81];
  •     int *tmp=tab;
  •     for(i=1;i<=9;++i){
  •         k=10*i;
  •         for(j=0;j<=9;++j)
  •             if(i!=j)
  •                 *(tmp++)=k+j;
  •     }
  •     while(~scanf("%d",&n)){
  •         --n;
  •         q=n/81;
  •         p=n-q*81;
  •         q+=3;
  •         k=q>>1;
  •         o=tab[p];
  •         for(i=0;i<k;++i)
  •             put_min_int(o);
  •         if(q&1)
  •             put_min_int(o/10);
  •         putchar('\n');
  •     }
  • }


  • RANK版
    @code
  • /**********************************************************************************/
  • /*  Problem: a828 "間隔數 ( number )" from 102北市賽                        */
  • /*  Language: CPP (640 Bytes)                                                     */
  • /*  Result: AC(8ms, 1.4MB) judge by this@ZeroJudge                                */
  • /*  Author: lfs92002 at 2014-06-23 21:33:44                                       */
  • /**********************************************************************************/


  • #include<cstdio>
  • using namespace std;
  • char buf[10000000],*ptr;
  • int main()
  • {
  •     register int i,j,k,o;
  •     int n,p,q;
  •     int tab[81]={10,12,13,14,15,16,17,18,19,20,21,23,24,25,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,45,46,47,48,49,50,51,52,53,54,56,57,58,59,60,61,62,63,64,65,67,68,69,70,71,72,73,74,75,76,78,79,80,81,82,83,84,85,86,87,89,90,91,92,93,94,95,96,97,98};
  •     while(~scanf("%d",&n)){
  •         --n;
  •         q=n/81;
  •         p=n-q*81;
  •         q+=3;
  •         k=q>>1;
  •         o=tab[p];
  •         j=o/10;
  •         o=o-j*10+'0';
  •         j+='0';
  •         ptr=buf;
  •         for(i=0;i<k;++i){
  •             *(ptr++)=j;
  •             *(ptr++)=o;
  •         }
  •         if(q&1)
  •             *(ptr++)=j;
  •         *(ptr++)=0;
  •         puts(buf);
  •     }
  • }




  • 回復

    使用道具 檢舉

    您需要登錄後才可以回帖 登入 | 加入我們

    本版積分規則

    快速回覆 返回頂部 返回列表