d166

討論區對題意詳細的說明

範例輸入: > 2 3 6 4 0 2 2 1 0

範例輸出 : > 5 9 1 8 2 6 4 7 3

分析:

首先先把輸入的數字先邊好

a1=2 , a2=3 , a3=6 , a4=4 , a5=0 , a6=2 , a7=2 , a8=1 , a9=0

a1=2 意思是說 1前面有2個比它大的數 此時就能知道 1

a2=3 意思是說 2前面有3個比它大的數 此時就能知道 1 2 _

a3=6 意思是說 3前面有6個比它大的數 此時就能知道 1 2 3

a4=4 意思是說 4前面有4個比它大的數 此時就能知道 1 2 4 _ 3 . . . 以此類推

這題你要自己判斷什麼時候結束,所以要一口氣讀 %d%c,後面的%c是拿來判斷是不是這個輸入結束了,假如讀'\n'表示結束了

for(i=0;i<=n+count;i++)
            if(flag[i]==1)
                count++;

flag[n+count] = 1;
   a[n+count] = len;

flag[]陣列表示,某一格有沒有放過東西了

對於每一個讀進來的n表示它前面至少要空幾格

假如前面有放過1個數字了,代表我還要多要1格,因為前面放的那個數字一定比我小,但是它佔了我的格數

拿題目的測資來舉例子:2,3,6,4,5,6,7,1,0

把1放到a[2],也就是第三格,flag[2]要從0變成1,表示a[2],有放數字

再來我本來要把2放到a[3],不過前面有一個放1了,所以我要多後退1格

所以把2放到a[4] ,flag[4]=1 ......這樣一直做到完

i<=n+count,為什麼要這樣寫,因為你不加count,有些位置會被取代,就是已經放了東西的格子

你又放東西進去,把原本的格子取代掉

#include <stdio.h>
#include <string.h>
int main() 
{
    int n,i;
    int len=0;
    int count;
    int a[50];
    int flag[50]={0};
    char c;

    while(scanf("%d%c",&n,&c)==2)
    {
        if(n == -1)
            break;


        count=0;
        len++;

        for(i=0;i<=n+count;i++)
            if(flag[i]==1)
                count++;


        flag[n+count] = 1;
           a[n+count] = len;


        if(c=='\n')
        {
            for(i=0;i<len;i++)
            {
                printf("%d ",a[i]);
            }
            puts("");


            len = 0;
            for(i=0;i<50;i++)
                flag[i]=0;
        }
    }
    return 0;
}