包藏宇宙之机,吞吐天地之志|

RainDuckling

园龄:2年2个月粉丝:1关注:12

2022-07-14 22:57阅读: 4评论: 0推荐: 0

【比赛笔记】Codeforces Round #762 (Div. 3)总结

在CF上用虚拟参加的方式打了一场比赛,过程是这样的:

1.首先A题比较顺利,写完代码后稍微调试了一下就过了,用时5分钟左右

2.B题看完题面有了些想法,但数据量太大,稍微想了一会宏观思路才成型,之后微观细节因为用到二分,而这一块我不大熟,因此时间较长。可是写完了在本地测试发现样例没过,拼命调试,大概几十分钟后发现没有想到平方数和立方数会重复,于是把代码改了之后提交AC了,用时一小时左右

3.C题初看觉得十分容易,但是代码有些复杂,因此一直做到比赛结束也没A掉

以下是几题我的代码与正解的区别:

1.A题几乎一样,因此不展示

2.B题我的代码使用向量实现的,排序,去重,查找等工作都需要手写,因此代码较为复杂:

#include<bits/stdc++.h>
#define forn(k,n) for(int i=k;i<=n;i++)
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a/(gcd(a,b))*b;}
int t;
vector <long long> a;

int main(){
	cin>>t;
	a.push_back(1);
	for(long long i=2;i*i<=1000000000;i++){
		a.push_back(i*i);
		a.push_back(i*i*i);
	}
	sort(a.begin(),a.end());
	for(int i=1;i<a.size();i++){
		if(a[i]==a[i-1])a[i]=0;
	}
	sort(a.begin(),a.end());
	int b=0;
	while(a[b]==0)b++;
	while(t--){
		long long n;
		cin>>n;
		long long l=b,r=(long)a.size()-1,mid;
		while(l<=r){
			mid=(l+r)/2;
			if(n<a[mid])r=mid-1;
			else l=mid+1;
//			cout<<l<<' '<<r<<' '<<a[mid]<<endl;
		}
		cout<<l-b<<endl;
	}
	return 0;
}

而正解使用的是自动有序,自动去重,查找O(log(N))复杂度的集合,因此代码十分简洁:

#include<bits/stdc++.h>
#define forn(k,n) for(int i=k;i<=n;i++)
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a/(gcd(a,b))*b;}
int t;

int main(){
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		set <int> a;		
		for(int i=1;i*i<=n;i++){
			a.insert(i*i);
		}
		for(int i=1;i*i*i<=n;i++){
			a.insert(i*i*i);
		}
		cout<<a.size()<<endl;
	}
	return 0;
}

3.C题我的代码出于方便的考虑耍花招用的是字符串,没想到用字符串反而更复杂,最后比赛结束了样例也没过,而正解则是中规中矩地用整数,代码如下:

#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a/(gcd(a,b))*b;}
int t;

int main(){
	cin>>t;
	while(t--){
		long long a,s;
		cin>>a>>s;
		vector <int> b;
		bool f=1;
		while(s){
			int x=a%10;
			int y=s%10;
			if(x<=y)b.push_back(y-x);
			else{
				s/=10;
				y+=10*(s%10);
				if(x<y&&y>=10&&y<=19)b.push_back(y-x);
				else{
					cout<<-1<<endl;
					f=0;
					break;
				}
			}
			a/=10;
			s/=10;
		}
		if(!f)continue;
		if(a)cout<<-1<<endl;
		else{
			while (b.back()==0)b.pop_back();
			for(int i=(int)b.size()-1;i>=0;i--)cout<<b[i];
			cout<<endl;
		}
	}
	return 0;
}

最后是我的反思:

1.做题之前应多想想,有没有更好的解决方案

2.做题时最好按常规出牌,除非非常确定能让代码更简洁,否则不要耍花招

3.打比赛时应当学会舍弃,合理安排时间,不要拘泥在一道题上

第一篇博客,不喜勿喷。。。

本文作者:RainDuckling

本文链接:https://www.cnblogs.com/RainDuckling/p/17531661.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   RainDuckling  阅读(4)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起