第K極值 用Free pascal實現

2025-01-26 15:05:10 字數 6245 閱讀 9830

1樓:big吸管

快排 取陣列中資料。

第k極值的解法pascal

2樓:o逸水之寒

那個……

我是出題人……

也就是tyvj的admin……

首先用快速排序(因為號稱資料是10w,悄悄告訴你……其實最大隻有100……當時我們學校模擬賽,臨時出的資料,所以……)

我貼個標程吧。

vara:array[0..100001] of longint;

i,j,k,n,max,min:longint;

function su(x:longint):boolean;

var i:longint;

beginif x<=1 then exit(false);

for i:=2 to trunc(sqrt(x)) doif x mod i=0 then exit(false);

exit(true);

end;procedure kuai(l,r:longint);

var i,j,k,t:longint;

begini:=l;

j:=r;k:=a[(i+j) div 2];

repeat

while a[i]k do dec(j);

if i<=j then

begint:=a[i];

a[i]:=a[j];

a[j]:=t;

inc(i);

dec(j);

end;until i>j;

if iif lend;

beginreadln(n,k);

for i:=1 to n do

read(a[i]);

kuai(1,n);

min:=a[k];

max:=a[n-k+1];

if su(max-min) then

beginwriteln('yes');

writeln(max-min);

endelse

beginwriteln('no');

writeln(max-min);

end;end.

寫的還是比較精煉的……

關於你的程式……

if t<2 then begin writeln('no'); halt; end;

貌似no之後還要輸出東西的……

請看:其他貌似沒問題了……

tyvj官方***20517473 歡迎您的加入……睡覺去了……

3樓:

10w的資料 n^2的效率肯定會超時的。

用快排procedure qsort(l,r:longint);

varq,p,mid,temp:longint;

beginq:=l; p:=r; mid:=a[random(r-l)+l];

repeat

while a[q]mid do dec(p);

if q<=p then

begintemp:=a[q];

a[q]:=a[p];

a[p]:=temp;

inc(q); dec(p);

end;until q>p;

if lif qend;

然後 +討論 那個 兩個數的差是否大於0 就可以過了。

4樓:網友

我的意見,給廣告(寒寒)吧。

第k極值 pascal

5樓:꒰ঌ夏枳

呵呵。 tyvj 第k極值?

下面**是很早很早寫的。你將就著吧 o(nlgn)的複雜。

如果你想要o(n)的演算法。可以hi我。

program e2;

vara:array[1..10000]of longint;

n,k,i,res:longint;

procedure paixu(x,y:longint);

vari,j,t,m:longint;

begini:=x;

j:=y;m:=(a[x]+a[y])div 2;

repeat

while a[i]m do dec(j);

if i<=j then

begint:=a[i];

a[i]:=a[j];

a[j]:=t;

inc(i);

dec(j);

end;until i>j;

if iif xend;function work(t:longint):boolean;

vari:longint;

beginwork:=true;

if t<=1 then exit(false);

for i:=2 to trunc(sqrt(t)) doif t mod i = 0 then work:=false;

end;begin

readln(n,k);

for i:=1 to n do

read(a[i]);

paixu(1,n);

res:=a[n+1-k]-a[k];

if work(res) then

writeln('yes')

elsewriteln('no');

writeln(res);

end.

6樓:夕日素顏依舊在

program kth;

vara:array[1..10000] of longint;

k,i,j,n,m,h:longint;

procedure qsort(s,t:longint);

vari,j,x,temp:longint;

begini:=s;j:=t;x:=a[(i+j) div 2];

repeat

while a[i]x do dec(j);

if i<=j then

begintemp:=a[i];a[i]:=a[j];a[j]:=temp;

inc(i);dec(j);

end;until i>j;

if sif iend;function pd(a:longint):boolean;

vari:longint;

beginif a<=1 then exit(false);

for i:=2 to trunc(sqrt(a)) doif a mod i =0 then exit(false);

exit(true);

end;begin

readln(n,k);

for i:=1 to n do read(a[i]);

qsort(1,n);

h:=a[k];j:=a[n-k+1];

m:=j-h;

if pd(m)=true then

beginwriteln('yes');

writeln(m);

endelse

beginwriteln('no');

writeln(m);

end;end.

能看懂麼?看不懂hi我!

極值問題 pascal

7樓:網友

經典問題,先要證明m,n是斐波那契數列中的相鄰兩項。首先證明斐波那契數列中的相鄰兩項是滿足(2)式的,這個非常簡單,用數學歸納法就可以了。再證明,如果兩個正整數m、n滿足(2)式,必有n>=m,且整數n-m、m也滿足(2)式(這裡的正整數對是有序的)。

於是我們可以一直這樣找下去:(m,n)=>n-m,m)=>2m-n,n-m)=>

直到括號裡的兩個數相等(如果一開始就有m=n的話,就不用找了)。很容易證明,如果兩個相等的正整數滿足(2)式,那麼他們都是等於1的。我們可以倒著找回去:

1,1)<=1,2)<=2,3)<=直到回到(m,n)為止。於是m、n為斐波那契數列中的相鄰兩項。

剩下的事情就簡單了:找出比k小的最大的相鄰兩個斐波那契數就可以了。

第k極值 pascal 求問錯在哪了

8樓:網友

大哥你沒賦初值,當m=1時,q的取值就不定了。所以應在begin後加。

q:=false;

第k極值pascal

9樓:網友

vara:array[0..100001] of longint;

i,j,k,n,max,min:longint;

function su(x:longint):boolean;

var i:longint;

beginif x<=1 then exit(false);

for i:=2 to trunc(sqrt(x)) doif x mod i=0 then exit(false);

exit(true);

end;procedure kuai(l,r:longint);

var i,j,k,t:longint;

begini:=l;

j:=r;k:=a[(i+j) div 2];

repeat

while a[i]k do dec(j);

if i<=j then

begint:=a[i];

a[i]:=a[j];

a[j]:=t;

inc(i);

dec(j);

end;until i>j;

if iif lend;

beginreadln(n,k);

for i:=1 to n do

read(a[i]);

kuai(1,n);

min:=a[k];

max:=a[n-k+1];

if su(max-min) then

beginwriteln('yes');

writeln(max-min);

endelse

beginwriteln('no');

writeln(max-min);

end;end.

我雖然不是tyvj的創始人逸水之寒,但是盜用了他老人家的程式。這裡向他道歉。。。

pascal語言程式設計問題(free pascal

10樓:

可以用篩法,先搞乙個2到10000的陣列,然後把2到10000的兩倍以上的數排出。剩下的就是素數。給個贊。如果還不行的話我打個程式。

pascal:第k極值

11樓:網友

總的來說,本題的思路還是比較清楚的。

首先,我們對讀入的資料進行排序,得到從小到大的n個數。那麼第k小的數就是這一串數中的第k個數,第k大的數就是第n-k+1,也就是倒數第k個數,相減得到差。再判斷質數即可。

vara:array[0..10010] of longint;

i,t,n,k:longint;

procedure qsort(r,l:longint);

vari,j,mid,t:longint;

begini:=r; j:=l;

mid:=a[(i+j)>>1];

repeat

while a[i]mid do j:=j-1;

if i<=j then

begint:=a[i]; a[i]:=a[j]; a[j]:=t;

i:=i+1; j:=j-1;

end;until i>j;

if iif rend;begin

readln(n,k);

for i:=1 to n do read(a[i]);

qsort(1,n);//因為n有10000,所以不能用普通的n^2的排序,要用nlogn的排序。比如現在用的快速排序。關於這個排序,因為本文的重點和篇幅關係。詳情請自行。

t:=abs(a[n-k+1]-a[k]);//如上所說。因為不保證第k大的比第k小的大,所以要取絕對值,也就是abs。其中abs(x)表示x的絕對值。

for i:=2 to trunc(sqrt(t)) do//列舉所有可能被t整除的數。顯然,只要到根號t就夠了。這一點請自行腦補。

if t mod i=0 then

beginwriteln('no');

writeln(t);

halt;//直接退出程式。

end;writeln('yes');

writeln(t);

end.

用Free Pascal列印空心圖形

varn,i longint begin readln n for i 1 to n do write writeln write for i 1 to n 2 do write writeln for i 1 to n do write writeln end.program ex const u...

free pascal題目奇怪的電梯用寬度搜尋

奇怪的電梯 copy 呵呵,有一天我做了 bai一個夢,夢見了一種du很奇怪的電梯。zhi大樓的每一層樓都可dao以停電梯,而且第i層樓 1 i n 上有一個數字ki 0 ki n 電梯只有四個按鈕 開,關,上,下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要求,相應的按鈕就會失靈。例如...

用free pascal編譯程序,請各位幫幫忙,要對的,最好快一點,高分懸賞,有兩道題,會多少是多少

1 program prsssoject1 varn integer procedure find n integer vari integer begin if n 2 then for i 2 to n div 2 1 dobegin if n mod i 0 then begin writel...