前言
B. Divisors of Two Integers
题意 :
给定一个
a
[
]
a[]
a[],从中找到两个数
x
,
y
x,y
x,y使得其余的数要么是
x
x
x的除数要么是
y
y
y的除数
思路:
显然的最大值必然是一个
如果存在两个最大值显然这两个就是
否则的话,我们就找到第一个不能被最大数整除的数,否则就是两个相等的数
code :
int n;
int a[N];
int cnt[N];
void solve(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],cnt[a[i]]++;
sort(a+1,a+1+n);
if(a[n] == a[n-1]){
cout<<a[n]<<' '<<a[n]<<endl;
return;
}
cout<<a[n]<<" ";
for(int i=n-1;i>=1;i -- ){
if(a[n]%a[i]!=0 || a[i] == a[i-1]){
cout<<a[i]<<endl;
return;
}
}
}
C. Nice Garland
前言 :
给定一个字符串,对于其下标
%
3
\%3
%3相同的位置,需要都是相同
R
,
G
,
B
R,G,B
R,G,B其中之一,询问的最小修改次数
思路 :
我们发现因为操作的后效性,影响了后面所有的字符串
所以总共的种类也就只有6种
R G B , R B G , B R G , B G R , G R B , G B R RGB,RBG,BRG,BGR,GRB,GBR RGB,RBG,BRG,BGR,GRB,GBR
因此我们暴力枚举判断即可
但是写起来好难
code :
char T[10][4] = {"RGB","RBG","GRB","GBR","BGR","BRG"};
string s;
int n;
int calc(char *T){
int need = 0 ;
int len = 0 ;
for(int i = 0; i<n;i ++ ){
if(s[i] != T[len]) ++need;
len = (len+1)%3;
}
return need;
}
void solve(){
cin>>n;
cin>>s;
int ans = INF;
int pos = 0 ;
for(int i = 0 ;i<6; i++ ){
int res = calc(T[i]);
if(res < ans){
ans = res;
pos = i ;
}
}
cout<<ans<<endl;
int len = 0;
for(int i = 0 ; i <n;i ++ ){
cout<<T[pos][len];
len = (len+1)%3;
}
}