【题意】
总共n*m张面值为1..n*m的扑克,n个人,每个人m张扑克,一共m轮,每轮每人出一张扑克,最大的人获胜,给出你的扑克,问你起码能赢多少局
【输入】
多组数据
第一行为n、m,若为两个0表示数据结束
接下来一行m个数字,表示自己的手牌
【输出】
对于每组数据,输出一个数字表示起码能赢多少局
贪心
首先把自己的牌从大到小排序,再把不是自己的牌从小到大排序
因为问的是起码能赢多少局,所以考虑最坏状况
m轮,每次看自己当前最大的是不是全场最大的,
是的话答案加一,自己的队列首指针加一,非自己的队列尾指针减n-1
不是的话,自己的队列首指针加一,非自己的队列首指针加一,尾指针减n-2
错误原因,把m打成了n,最近经常犯一些低级错误,需要重视
program poj1323; type arr=array [0..1001] of longint; var ans,t,m,n,i,j,k,s1,s2,e1,e2:longint; yes:array [0..1001] of boolean; dl,xl:arr; procedure swap (var a,b:longint); var i:longint; begin i:=a; a:=b; b:=i; end; begin t:=0; repeat read(n,m); if (n=0)and(m=0) then break; inc(t); fillchar(yes,sizeof(yes),false); for i:=1 to m do begin read(k); yes[k]:=true; end; e1:=0; e2:=0; for i:=n*m downto 1 do if yes[i] then begin inc(e1); dl[e1]:=i; end else begin inc(e2); xl[e2]:=i; end; s1:=1; s2:=1; ans:=0; for i:=1 to m do if dl[s1]>xl[s2] then begin inc(ans); inc(s1); e2:=e2-n+1; end else begin inc(s1); inc(s2); e2:=e2-n+2; end; writeln('Case ',t,': ',ans); until false; end.