Codeforces Round #535 (Div. 3)
A题:
刚开始做的时候看了两眼题目,又看了看样例,再加上那个图,就有了这个题很难的错觉,直接转B题了,做完B之后,发现队友A都过了。。。。。又回来一个单词一个单词的看。
这个题的大致意思也就是给一个数字n,然后下面n行,每行4个数字,前两个是l1—r1,后两个数字是l2—r2,这两段可以有重复的地方,甚至可以重叠。然后题目要求分别找出在这两段之内的任意一个数,a,b。a不等于b即为正确答案,输出a和b。
没什么可说的直接代码吧:
#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个数字,然后这些数字分别是,数字a和b的约数,如a为8,b为20,那么这组数据就是1 2 4 8 1 2 4 5 10 20。这个题给了这一组数据,要求输出a和b。
这个题拿到之后,先不着急做,先分析一下特殊情况:
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会不会超时,发现可以直接暴力,代码写的也很丑,等着借鉴一下大神的看看吧。。。今天就先写到这里。