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;
}