Codeforces Round #535 (Div. 3) 赛后总结

Codeforces Round #535 (Div. 3)

A题:

在这里插入图片描述
刚开始做的时候看了两眼题目,又看了看样例,再加上那个图,就有了这个题很难的错觉,直接转B题了,做完B之后,发现队友A都过了。。。。。又回来一个单词一个单词的看。
这个题的大致意思也就是给一个数字n,然后下面n行,每行4个数字,前两个是l1—r1,后两个数字是l2—r2,这两段可以有重复的地方,甚至可以重叠。然后题目要求分别找出在这两段之内的任意一个数,aba不等于b即为正确答案,输出ab
没什么可说的直接代码吧:

#include <iostream>
#include <cstring>
#define ll long long
using namespace std;
ll a[4];
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		memset(a,0,sizeof(a));
		
		for(int j=0;j<4;j++){
			cin>>a[j];
		}
		
		for(ll p=a[0];p<=a[1];p++){
			int flag=0;
			for(ll q=a[2];q<=a[3];q++){
				if(p!=q){
					cout<<p<<" "<<q<<endl;
					flag=1;
					break;
				}
			}
			if(flag)
				break;
		}
	}
	return 0;
}

B题:

在这里插入图片描述
这个题的大致意思是,第一行给定一个数字n,第二行有n个数字,然后这些数字分别是,数字ab的约数,如a为8,b为20,那么这组数据就是1 2 4 8 1 2 4 5 10 20。这个题给了这一组数据,要求输出ab

这个题拿到之后,先不着急做,先分析一下特殊情况:
1.a可能是b的约数
2.a和b可能是同一个数

我的思路是拿到这组数据后,先进行排序,然后最大的那个数,肯定是答案之一。然后利用最大的数,把它所有的约数都删除(只删一次,例如有a=10,b=20时,只删除一次10),最后在剩下的数字中找一个最大的值,即为另一个答案。

代码:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int a[200];
int vis[10005];
int flag[200];

int main(){
	memset(vis,0,sizeof(vis));
	memset(flag,0,sizeof(flag));
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>a[i];
		
	sort(a,a+n);

	int temp=a[n-1];
	for(int i=n-1;i>=0;i--){
		if(temp%a[i]==0 && vis[a[i]]==0 && flag[i]==0){
			vis[a[i]]=1;
			flag[i]=1;
		}	
	}

	int ans;
	for(int i=n-1;i>=0;i--){
		if(flag[i]==0){
			ans=i;
			break;
		}
	}
	
	cout<<temp<<" "<<a[ans]<<endl;
	return 0;
}

C和D题暂时就不说了(一个就做出来四道),因为当时打比赛有时间限制,所以直接算了一下CD会不会超时,发现可以直接暴力,代码写的也很丑,等着借鉴一下大神的看看吧。。。今天就先写到这里。

猜你喜欢

转载自blog.csdn.net/douying886/article/details/86620238