JZOJ8.12(C组)作弊的发牌者

    xiaoxiao2024-12-26  15

    题目:

    贝茜正在与她的N-1(2 <= N <= 100)个朋友打牌。她们玩的牌一副为K(N<=K<=100,000,K 为N 的倍数)张。所有牌中,一共有M(M = K/N)张“好牌”,其余的K-M 张为“差牌”。贝茜是游戏的发牌者,很自然地,她想把所有好牌都留给自己。她热衷于 获胜,即使为此必须采取一些不正当的手段。   在若干局游戏后,贝茜的朋友们开始怀疑贝茜在游戏中作弊,于是她们想了个对策:使用新的发牌规则。规则具体如下:   1. 贝茜把牌堆的最上面一张发给她右边的奶牛;   2. 每当贝茜发完一张牌,她都得将牌堆顶部接下来的P(1 <= P <= 10)张牌放到底部去(一般把这个操作称为切牌);   3. 然后,贝茜对逆时针方向的下一头奶牛重复上述的操作;   贝茜绝望地认为,她再也不可能获胜了,于是她找到了你,希望你告诉她,将好牌放在初始牌堆的哪些位置,能够确保它们在发完牌后全集中到她手里。顺带说明一下,我们把牌堆顶的牌定义为1 号牌,从上往下第二张定义为2 号牌,依此类推。

    分析:

    这题一看数据并不大就直接纯模拟啦。

    附上代码:

    const   maxn=100000; var   ans,data:array [0..maxn] of longint;   v:array [0..maxn] of boolean;   bj,n,k,p:longint; procedure init; var   i:longint; begin   readln(n,k,p);   for i:=1 to k do     data[i]:=i; end; procedure main; var   i,j,temp,test:longint; begin   temp:=0;   fillchar(v,sizeof(v),true);   i:=1;   while temp<>k div n do     begin       if (bj+1) mod n=0 then         begin           while not v[i] do             begin               inc(i);               if i>k then                 i:=i-k;             end;           inc(temp);           ans[temp]:=data[i];         end;       if v[i] then         v[i]:=false       else         begin           while not v[i] do             begin               inc(i);               if i>k then                 i:=i-k;             end;           v[i]:=false;         end;       inc(bj);       inc(i);       if i>k then         dec(i,k);       test:=0;       while test<>p do         begin           if temp=k div n then             break;           if v[i] then             inc(test);           inc(i);           if i>k then             dec(i,k);         end;     end; end; procedure qsort(l,r:longint); var   i,j,k,mid:longint; begin   i:=l;   j:=r;   mid:=ans[(l+r) shr 1];   repeat     while ans[i]<mid do       inc(i);     while ans[j]>mid do       dec(j);     if i<=j then       begin         k:=ans[i];         ans[i]:=ans[j];         ans[j]:=k;         inc(i);         dec(j);       end;   until i>j;   if l<j then     qsort(l,j);   if i<r then     qsort(i,r); end; procedure print; var   i:longint; begin   qsort(1,k div n);   for i:=1 to k div n do     writeln(ans[i]); end; begin   init;   main;   print; end.

    转载请注明原文地址: https://ju.6miu.com/read-1295019.html
    最新回复(0)