【POJ 1012 模拟】

本文详细介绍了如何通过逐步优化方法解决POJ在线编程竞赛中的特定问题,包括利用数学规律减少时间复杂度,以及利用预计算结果提高效率。特别强调了在处理环形结构问题时,如何通过观察特殊情况进行一般化,以及如何利用已知信息优化算法性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://poj.org/problem?id=1012

我们从点1开始编号,则初始情况一共有2*k个点

假设b为已经杀掉的人数,now为现在的起始位置,next为下一个杀掉人的编号,初始时,b=now=0

 

则第一步,next=(0+m-1)%(2k-0)+1,(减1取模后再加1,为了防止0的出现),编号为next的人被杀掉,注意,此时的now不是next,而是next-1!然后再循环找下去就行,next=(now+m-1)%(2*k-b),由于不需要知道被杀掉的人原来的编号,杀掉这个人后,我们可以把整个环的数量减1,而所有坏人和好人都是还是各自连在一起的,所以不会有影响

 

后来看了discuss后,经牛人点拨,得知m必定为k+1的整数倍或者k+1的整数倍加1,为什么呢?考虑只剩下两个坏人时,他们此时的编号为k+1和k+2,如果杀掉的是k+1,那么走m=n*(k+1)+1步后可以杀掉原来编号为k+2的人,而如果先杀掉的是原来编号为k+2的,那么走m=n*(k+1)步后可以杀掉原来编号为k+1的人。这个解释太精彩了!这样优化后,可以从200多ms跑到100ms左右

 

总结:做题就是这样的,先从最笨的方法开始,然后在此基础上进行优化,另外,对于一些规律性的东西,可以从特殊情况或者最简单的情况去挖掘信息!还有,这题有很多组测试数据,但最多13种情况,我们可以将某种情况算出来的结果保存下来,下次再测试时直接输出!

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int f[100];
bool go(int m,int k){
    int cnt=0,now=0,next,b=0;
    while(true){
        next=(now+m-1)%(2*k-b)+1;
        if(next<=k)
            return false;
        else{
            now=next-1;
            b++;
            if(b==k)
                return true;
        }
    }
}
int main(){
    int k;
    while(~scanf("%d",&k)){
            if(!k)
                break;
            if(f[k]){
                printf("%d\n",f[k]);
                continue;
            }
            int i;
            for( i=k+1;;i++){
                if(i%(k+1)>1)
                    continue;
                if(go(i,k))
                    break;
            }
            f[k]=i;
            printf("%d\n",i);
    }
}



内容概要:本文深入探讨了Kotlin语言在函数式编程和跨平台开发方面的特性和优势,结合详细的代码案例,展示了Kotlin的核心技巧和应用场景。文章首先介绍了高阶函数和Lambda表达式的使用,解释了它们如何简化集合操作和回调函数处理。接着,详细讲解了Kotlin Multiplatform(KMP)的实现方式,包括共享模块的创建和平台特定模块的配置,展示了如何通过共享业务逻辑代码提高开发效率。最后,文章总结了Kotlin在Android开发、跨平台移动开发、后端开发和Web开发中的应用场景,并展望了其未来发展趋势,指出Kotlin将继续在函数式编程和跨平台开发领域不断完善和发展。; 适合人群:对函数式编程和跨平台开发感兴趣的开发者,尤其是有一定编程基础的Kotlin初学者和中级开发者。; 使用场景及目标:①理解Kotlin中高阶函数和Lambda表达式的使用方法及其在实际开发中的应用场景;②掌握Kotlin Multiplatform的实现方式,能够在多个平台上共享业务逻辑代码,提高开发效率;③了解Kotlin在不同开发领域的应用场景,为选择合适的技术栈提供参考。; 其他说明:本文不仅提供了理论知识,还结合了大量代码案例,帮助读者更好地理解和实践Kotlin的函数式编程特性和跨平台开发能力。建议读者在学习过程中动手实践代码案例,以加深理解和掌握。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

paidream

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值