哪位C語言大神看看這道題。用最簡單易懂的方法解決,初學C語言要註釋謝謝

2021-04-02 12:48:08 字數 3920 閱讀 4468

1樓:匿名使用者

這個題的難點在於怎麼計算最小移動次數。

從舉例來看,2 4 3 5 6 1,有一個特點,能夠找到幾組最大的基本有序的數列,如:2 3 5 6 或 2 4 5 6,這兩組數列個數都為4個,那麼只要移動剩下兩個數字,就能用最小的移動次數來達成目標。

再找一個例子:10 5 6 1 4 7 8 2 3 9,其最大的基本有序數列為:5 6 7 8 9 或 1 4 7 8 9,那麼最小移動次數為 10 - 5 = 5。

所以,可以把這個問題轉化為尋找一組數列的基本有序數的最大個數。

一種簡單的演算法為:

先取第1個數,然後從第2個數開始取,只要比第1個數大,就取出來,然後繼續往後面取數,只要滿足比前面取到的數大,就取出來。最後會得出一組有序數列

記錄這組有序數列的個數

從這組有序數列的最後一個數開始,把這個數去掉,然後再從這個數對應的原來數列的位置的後面開始取值,構成新的有序數。再記錄其個數。重複刪除這組數列的最後一個,直到刪除到這組數列的第1個為止。

原序列中的第1個陣列成的有序數統計結束,再取第2個數進行上面流程的統計。

上面一大段說的有點暈,舉個例子,2 4 3 5 6 1。

按上面的演算法處理,第1個取 2, 第2個 4, 第3個 不能取3,因為3比4小,所以取5,第4個取6。

所以第一個有序數列為 2 4 5 6

然後對取出來的數列進行刪除處理,把6去掉,剩下 2 4 5 ,6在原來序列的倒數第2個位置,那麼繼續取值,6後面的數字是1,5比1大,不能取出來,所以新數列為 2 4 5

再對 2 4 5 進行刪除操作,得到 2 4 ,5在原來位置的後面數字是6,可以取出來,形成新數列 2 4 6

再對 2 4 6 進行刪除操作,得到 2 4 ,6在原來位置的後面數字是1,不能取,後面已經沒值,新數列 2 4

再對 2 4 進行刪除操作,得到 2,4在原來位置後面是3,可以取出來,再往後取5,取6,得到新數列2 3 5 6

後面就不再列出來了,反正就是從後往前遍歷了,最後統計組成有序數列的數字個數最大的那個值。

最後再用n減去這個值,就是目標所要求的最小操作次數了。

說了一大堆,下面給出示例**(**裡定義了一個debug,用來除錯用的,手動輸值太麻煩):

#include

#include

#define debug 0

int alltest = 0;//記錄所有測試項數量

void printall(int **p)

}//統計數列的個數

if(max < (index+1))}}

return max;

}void makedatafordebug(int **p),,,

,,};alltest = sizeof(data)/sizeof(data[0]);

for(i=0;i

2樓:落寞

呵呵噠,你高中的吧,noip複賽題

各位c語言大神來看看這道程式設計題!!

3樓:涼薄女子一

#include

int main(void)

, , };

int i = 0, j = 0;

for (i=0; i < 3; i++)printf("\n");

for (i = 0; i < 3; i++)printf("\n");

for (i = 0; i < 3; i++)return 0;}

求大神幫忙解決這道c語言的題

4樓:zz迎風

#include

#define m 10

void main()

,i=0,j,m;

printf("\nplease enter an integer number between 4 and 10:");

scanf("%d",&m);

for(j=0;j

容a[j]=(j+1)*(j+1);

printf("\nthe output :\n");

for(i=m-1;i>=0;i--)

printf("%4d",*(a+i));}

哪位c語言大神幫我說明一下這道題?

5樓:天星旋光

#include

void main()

6樓:匿名使用者

1,是往後移一位,繼續查詢

for迴圈是找到x的位置後,將陣列a中x位置後面的值往前移一位,即a[i]=a[i+1]

7樓:

a=5,b=0,c=3

%d前面兩個沒空格分隔

還有if是要用大括號的,如果沒有,就只執行後面一句!

不然a=b,b=t是不關if管的了,它照樣執行

8樓:匿名使用者

一條語句一條語的看:

int a=4,b=3,c=5,t=0;

//這個是賦值不用說了

if(a不成立,t=a;不執行。繼續

回往下執行a=b;現在a=3,。執答行b=t;現在b=0;

if(a

//a=3,c=5,a

到此為止,a=5,b=0,c=3,t=3

printf("%d%d %d \n",a,b,c);

第二%d後有個空格,所以結果是 50 3,如果沒有應該是503

9樓:匿名使用者

你這個程式設計啊···先看程式設計規範吧!

10樓:匿名使用者

你應該把if後面的3個語句括起來。不然只執行了if(a

都不是if的範圍內

11樓:匿名使用者

這是重新bai排列過

du的zhi,注意if語句只

dao是到;內

就完了容

#include

void main()

12樓:

這種來問題,你叉開看

int a=4,b=3,c=5,t=0;

if(a這是一個自域。一起執行

,滿足條件執行

a=b;b=t; 這是什麼條件下都執行的,順序執行if(a

printf("%d%d %d \n",a,b,c);

13樓:大同天下走一遭

呵呵,這復個錯誤太制基礎了

你的if條件語句,就是換位的沒有用括號括起來,所以if條件只限制一句於是你的語句變成了以下的語句

if(a

a=b;

b=t;

if(a

a=c;

c=t;

第一句條件不足未執行,後面5句都執行了,得到a=5,b=0,c=3的結果

14樓:不愛到愛

因為if(a

if(a

將**改為

if(a

if(a

可以達到你要的結果

c語言題目。這道題看不懂。。求大神詳細解釋下,謝謝

15樓:匿名使用者

答案選b。

定義結構體陣列c

未執行f(c)時,c[0]為 qian,f,95,92 c[1]為 sun,m,98,99

執行f(c)時,將c作引數傳遞

執行f(c)後將c[1]的值改變為 zhao,m,85,90f()函式作用就是對c[1]重新賦值

請同學們看看這道題C語言

錯在q a 10 q 首先陣列a 是10個元素,但是是從a 0 到a 9 所以理論上講a 10 是錯誤的,你讓q指向他,然後再指向他的下一個數,沒有任何意義.根據你的程式 結果完全爭取 不知道 你需求是要什麼結果 不過 風格確實差 有些技巧不知道是有意還是無意 你說一哦下你這個程式的功能是什麼,不然...

求大神用c語言編寫這道程式,求大神用c語言編寫這道程式

請家現再幫我解決補充問題 間 20137月514 44 25 目 想用if功能實現輸入字元y則顯示123否則顯示321 include char main void 何輸入char或者int結都確 vc6.0執行結 請輸入 y n y 12 ress any key to continue請輸入 y...

請幫忙看看這道簡單的C語言題,要有解析為什麼選B而不選D

因為字串後面有一個預設的 0 它要佔一個位置,所以選b ac顯然是錯的 字串最後是有一個 0的 在c語言中,bai 陣列儲存 資料,每du一個地址儲存zhi一個資料,最後要預留dao一個回地址儲存比如 答換行符之類的資料。b 定義了儲存六個資料的陣列,世紀儲存只能夠儲存五個資料,d 定義了儲存五個資...