jzoj 1568. 【普及模拟】石子游戏 解题报告

本文介绍了一种模拟算法实现的石子游戏问题解决方案。玩家放置黑白石子时需遵循特定规则,通过算法优化来确定最终桌面白石子数量。文章提供了完整的程序代码示例。
题目描述
你在桌子上放白和黑两种颜色的石子,第i个石子放在左边第i个位置,一共放了N个石子,当你放第i个石子必须遵循以下规则:

1.当i是奇数时:直接放在左数第i个位置上;

2.当i是偶数时:如果第i个石子和第i-1个石子颜色相同,直接放在第i个位置上;否则把当前最右边的连续的颜色相同的石子全部用相反颜色的石子取代,然后在第i个位置上放下石子i。

例如,假设桌子上现状是:○○●●○○○(○代表白石子,●代表黑石子)

如果第8个石子是白色,因为它和第7个石子颜色相同,就直接放在最右边就可以了,桌面上变成:○○●●○○○○;

如果第8个石子是黑的,因为和第7个颜色不同,就先把右边连续的3个白石子用黑石子代替,然后再放下第8个石子,变成:○○●●●●●●。

写一个程序,给你每个石子的颜色,输出最终桌面上白石子的数量。
输入
第一行输入一个整数N(1<=N<=100,000),接下来N行每行一个数C,表示N个石子的颜色,0表示白色,1表示黑色。

输出
输出一个整数表示最终白石子的数量。
样例输入
8

1

0

1

1

0

0

0

0

样例输出
6

代码如下:这题如果真的用模拟来做绝壁超时,所以,我们需要小小的优化一下。

var
 a,b:array[0..100000]of longint;
 i,j,k,n,ans:longint;
begin
 assign(input,'stone.in');reset(input);
 assign(output,'stone.out');rewrite(output);
 readln(n);
 for i:=1 to n do
  begin
   readln(k);
   if i mod 2<>0 then
      begin
       inc(j);
       b[j]:=k;
       a[j]:=1;
       if (b[j]=b[j-1])and(j-1>0) then
        begin
         b[j]:=0;
         a[j]:=0;
         dec(j);
         inc(a[j]);
        end;
      end
   else
     begin
      if (k<>b[j])and(j-1>0) then
       begin
        inc(a[j-1],a[j]+1);
        b[j]:=0;
        a[j]:=0;
        dec(j);
       end
      else if k=b[j] then  inc(a[j])
      else begin b[j]:=abs(b[j]-1); inc(a[j]); end;
     end;
  end;
 for i:=1 to j do
 if b[i]=0 then ans:=ans+a[i];
 write(ans);
 close(input);close(output);
end.


评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值