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]重新賦值 錯在q a 10 q 首先陣列a 是10個元素,但是是從a 0 到a 9 所以理論上講a 10 是錯誤的,你讓q指向他,然後再指向他的下一個數,沒有任何意義.根據你的程式 結果完全爭取 不知道 你需求是要什麼結果 不過 風格確實差 有些技巧不知道是有意還是無意 你說一哦下你這個程式的功能是什麼,不然... 請家現再幫我解決補充問題 間 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... 因為字串後面有一個預設的 0 它要佔一個位置,所以選b ac顯然是錯的 字串最後是有一個 0的 在c語言中,bai 陣列儲存 資料,每du一個地址儲存zhi一個資料,最後要預留dao一個回地址儲存比如 答換行符之類的資料。b 定義了儲存六個資料的陣列,世紀儲存只能夠儲存五個資料,d 定義了儲存五個資...請同學們看看這道題C語言
求大神用c語言編寫這道程式,求大神用c語言編寫這道程式
請幫忙看看這道簡單的C語言題,要有解析為什麼選B而不選D