[CF]_[心得]_[877C]

原题目
斯拉瓦克扮演他最喜欢的游戏“和平闪电”。现在他正在一个非常具体的地图上飞行一架轰炸机。
正式地,地图是大小为1×n的方格域,其单元格从1到n编号,在每个单元格中可以有一个或多个坦克。斯拉瓦不知道坦克的数量和他们的位置,因为他飞得很高,但他可以在任何一个单元格中放一个炸弹。这个单元格中的所有坦克都将被损坏。
如果坦克第一次受到伤害,它会立即移动到相邻的一个单元之间(单元格n中的一个槽只能移动到单元格n - 1,单元格1中的一个槽只能移动到单元2) 。如果一个坦克第二次受到伤害,它被算作被破坏,再也不会动作。这些坦克首先被损坏时才会移动,它们不会自动移动。
帮助Slava尽可能少的炸弹来摧毁所有坦克。
输入
第一行包含单个整数n(2≤n≤100000) - 地图的大小。
产量
在第一行打印m - 最少数量的炸弹Slava需要摧毁所有坦克。
在第二行打印m个整数k1,k2,…,km。数字ki意味着第i颗炸弹应该被放在细胞。上。
如果有多个答案,您可以打印任何一个。

题目乍一看有点别扭,不好理解,第一次的WA时的确是由于题目理解偏差。n个格子,每个里面都有一些坦克(为了保证全部消灭,可以看作两组),每次轰炸,对于第一次受损的坦克,一组向左移一格,二组向右移一格(除两端点处),第二次受损则消失。
先提出一种可行方案,分三步:
1,先向偶数格中丢炸弹(共n/2个,整除)。此时所有的坦克均移到奇数格中。
2,再向奇数格中丢炸弹(n为偶数时共n/2个,n为奇数时共n/2+1个)。此时已经移动过的坦克被破坏,剩下的全部移入偶数格中。
3,最后在向偶数格中丢一次炸弹(共n/2个),将剩余坦克破坏。

如此,当n为偶数时,共需要(n/2*3)枚炸弹,n为偶数时共需要(n/2*3+1)枚炸弹。
投弹次序即:所有偶数格,所有奇数格,再所有偶数格。
这样的方案是可以AC的,但我只是在直觉上觉得这样是投弹最少的,但为什么,一时想不清楚。这里做个标记。
最后贴代码

#include<stdio.h>
int main()
{
    long int i,n;
    scanf("%ld",&n);
    if (n % 2 == 0)
        {
            printf("%ld\n",n/2*3);
            for(i = 1; i <= n/2;i++) printf("%d ",i*2);
            for(i = 1; i <= n/2;i++) printf("%d ",i*2-1);
            for(i = 1; i <= n/2;i++) printf("%d ",i*2);
        }
    else 
        {
            printf("%ld\n",n/2*3+1);
            for(i = 1; i <= n/2;i++) printf("%d ",i*2);
            for(i = 1; i <= n/2+1;i++) printf("%d ",i*2-1);
            for(i = 1; i <= n/2;i++) printf("%d ",i*2);
        }
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值