补题报告
一、题目报告
比赛中第一题,第二,三,四题0分,第五题30分;比赛后全部AC。
二、赛中概况
首先,开始做的第三题,简单的模拟,但是不知为何一直不对;
第五题暴力拿了30分;
剩下几个0分;
三、解题报告
T1.小可操作特殊数列
题目情况
比赛时0分,赛后AC。
题目大意
特殊数列为:长度为n的数列,且数列内容为1~n的随机排列。
小可想将特殊数列排列成从1到n升序的形式,特殊数列有一定禁制,只能进行如下两种操作:
把数列第一个数字放到末尾。
把数列反转。
请问如果把数列排列成为1~n升序形式,最少需要多少次操作?
题目解析
这题就是纯思维题,总共有四种情况:
(1) 1,2,3,4,...,n-1,n
(2) n,n-1,...4,3,2,1
(3) 4,5,1,2,3
(4) 3,2,1,5,4
T2.XXS玩游戏
题目情况
比赛时0分,赛后AC
题目大意
模拟
题目解析
没啥好说的,纯纯模拟,但是数据太强,又细节
记得关闭输入输出同步
正解代码
接下来奉上正解代码
#include<bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n;
while(cin>>n) {
long long z=5000,ans=0;
long long x=1,y=0,f=0;
while(n--) {
string s;
cin>>s;
if(s=="Save") {
if(x<10){
x++,z+=5000;
}
else{
z+=10000;
}
} else if(s=="Attack") {
if(y<10) {
y++;
z+=1000;
}
else {
if(x<10){
x++;
z+=5000;
y=0;
}
else{
z+=10000;
}
}
}
else if(s=="Miss") {
x--;
if(x==0&&f==0){
f=ans;
}
y=0;
z/=2;
z/=1000;
z*=1000;
}
ans+=(x*z);
}
cout<<(f!=0?f:ans)<<"\n";
}
return 0;
}
T3.重峦叠嶂
题目情况
比赛时0分,比赛后AC。
题目大意
形如 191919 这样的,两个数字交替出现形成的一个数字,我们称他为山峰数字。
一个山峰太孤单了,我们更喜欢重峦叠嶂的。如:十进制的数字 191919 ,其十一进制的形式为121212,这也是一个山峰数字,所以称这个十进制数字为二重峰。
类似的,我们可以发现一些数字是三重峰,还有的是四重峰,请找出 [a,b] 进制下,[L,R]范围内 的所有的x重峰数字
题目解析
先枚举进制,再枚举两个数字,再向后添加,然后用桶来计数,看一个数字再不同进制下满足山峰数字的个数
正解代码
接下来奉上正解代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a,b,l,r,x,t[11451411];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>a>>b>>l>>r>>x;
for(int i=a;i<=b;i++){
for(int j=1;j<i;j++){
for(int k=0;k<i;k++){
if(j!=k){
int num=0,tmp=0;
while(num<=r){
if(tmp%2==0){
num=num*i+j;
}else{
num=num*i+k;
}
tmp++;
if(num>=l&&num<=r){
t[num]++;
}
}
}
}
}
}
for(int i=l;i<=r;i++){
if(t[i]==x){
cout<<i<<"\n";
}
}
return 0;
}
T4.生日礼物
题目情况
比赛时30分,比赛后AC。
题目大意
数字王小可马上就要过生日了,达达想要挑选一个特殊的数字做为礼物进行赠送。
首先达达需要挑选出一个数字,例如数字K,然后选择[1, K]之间约数最多的数字做为送给数字王小可的礼物。
请问这个数字有多少约数
题目解析
非常抽象
先去打表,再写深搜用来构造数字,利用唯一分解定理,在指定范围内构造出因数更多的数字:
枚举素数,然后算出幂次方,使得底数越小的,幂次方越多(小优化),这样幂越多,他的因数就越多
(非常难受)
正解代码
接下来奉上正解代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int prime[11451411],cnt=0;
bool np[11451411];
int dfs(int pos,int n,int ans,int prev){
if(pos==cnt+1||prev==0){
return ans;
}
int tmp=n,res=0,mi=0;
while(tmp&&mi<=prev){
res=max(res,dfs(pos+1,tmp,ans*(mi+1),mi));
tmp/=prime[pos];
mi++;
}
return res;
}
void prime1(){
np[0]=np[1]=1;
for(int i=2;i<=10000000;i++){
if(!np[i]) prime[++cnt]=i;
for(int j=1;j<=cnt&&i*prime[j]<=10000000;j++){
np[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
prime1();
int T;
cin>>T;
while(T--){
int k;
cin>>k;
cout<<dfs(1,k,1,10000000)<<"\n";
}
return 0;
}
四、总结
1、在一个题目上思考时间不足,“以为”自己已经读懂,就动手开始写代码,但是细节还没有考虑清楚,实际做法也没有想完整,导致一个程序反复改多次,时间浪费严重
2、读题,尤其题面较长题目,只看大概,读题不完整,“关键”字眼没有扣清楚
3、心态不好,多次提交WA之后,心态开始崩溃,开始快速浏览其他题目,每个题目都看个大概,写个大概,都没有深入的进行完成。
4、代码细节处理问题比较大,例如:多测注意点、int还是long long、初始赋值等
5、debug能力弱,尤其是遇到逻辑错误,基本无能为力,手造的样例也不够强,导致难以发现逻辑上的漏洞。