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

来源:互联网 发布:2017淘宝加权重刷法 编辑:程序博客网 时间:2024/06/08 08:48

原题目
斯拉瓦克扮演他最喜欢的游戏“和平闪电”。现在他正在一个非常具体的地图上飞行一架轰炸机。
正式地,地图是大小为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;}