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...