12月补题记

12月前几天是补题日子,博主分享周赛解题情况。周赛一D题因不必要遍历提交多次;周赛二D题是编码解码,分析得出原单词读取顺序使复杂度为O(n);F题是排队问题,用队列有局限,需加快遍历进程,后续内容待下篇分享。

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

转眼就12月份了,又将会是忙碌的一月呀!
后面不清楚,但12月份的前几天一定是充实的补题日子!
周赛一–D题挺坑的,居然提交了四次,这是我万万没想到的。
前面以为是数据爆了,后面发现是做了大量的不必要++遍历
这里还是放一下代码吧,警醒自己!

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    ll n,m,k,L;
    scanf("%lld%lld%lld%lld",&n,&m,&k,&L);
    cin>>n>>m>>k>>L;

    ll ans=(L+k)/m;
    while(ans*m<=n){
        if(ans*m-k>=L)
            break;
        ans++;
    }

    if(ans*m>n) ans=-1l;
    printf("%lld",ans);

return 0;
}

下面再来讲讲周赛二中有印象的一些题:
–D题
这题说的是一个编码解码的事,告诉我们编码规则然后叫我们解码。
因为英语差,脑子里coding和encode一直在嗡嗡响,愣是傻了很久才知道反求原码而不是写一个编码的程序。
编码思路不难想到,但是我觉得我想出来的算法复杂度挺高的,至少方法挺复杂的。
但是反求原码嘛!(嘿嘿)
首先是思考编码规则,每次取出中间位置的字母然后放在新单词的后面。不难得出,新单词的倒数第二个字母必定是原单词的第一个字母(边界条件另行考虑),进一步分析得出原单词可以由新单词以一个特定的顺序读取出来。这样的话复杂度就是O(n),代码如下:

#include<bits/stdc++.h>
using namespace std;

int main(){
    int len;
    cin>>len;
    string s;
    cin>>s;
    if(len==1)cout<<s;
    int p=len-2;
    while(p>=0){
        cout<<s[p];
        if(p==1)cout<<s[0];
        p-=2;
    }
    p+=3;
    while(p<len){
        cout<<s[p];
        p+=2;
    }
return 0;
}

–F题
这题说的是一个排队的事。。。
看到排队忍不住的就想到队列queue,确实,队列在这题中绝对好用(如果不考虑时间复杂度和空间复杂度的话)。
可想而知,当数据足够大,求得答案的同时,队列后面还排着相当长的队伍。
如果不使用队列,又不能通过什么万能的公式直接求得n处的排队情况。所以还是老法子,慢慢来,一个接着一个的往后推。但是这样时间复杂度仍然很大,而且不进行数据的临时存储的话又基本没法继续往后推。。。
所以应该加快遍历的进程。
具体方法见下面代码。

#include<bits/stdc++.h>
using namespace std;
string s[]={"Sheldon","Leonard","Penny","Rajesh","Howard"};
int main(){
    int n;
    cin>>n;
    int x=1;
    while(n-5*x>0){
        n-=5*x;
        x*=2;
    }
    int ans=n/x;
    if(n%x==0)ans--;
    cout<<s[ans];

return 0;
}

博客太长也不好,后续见下篇。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值