现在的位置: 首页 > 综合 > 正文

poj1323

2018年04月26日 ⁄ 综合 ⁄ 共 900字 ⁄ 字号 评论关闭

【题意】

总共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.
【上篇】
【下篇】

抱歉!评论已关闭.