转眼就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;
}
博客太长也不好,后续见下篇。。。