Y1-1补题报告

补题报告

一、题目报告

比赛中第一题,第二,三,四题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能力弱,尤其是遇到逻辑错误,基本无能为力,手造的样例也不够强,导致难以发现逻辑上的漏洞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值