晚上要打ABC,赶紧热身一下。
目录
1108B - Divisors of Two Integers
1684A - Digit Minimization
题目大意:
十进制表示法中有一个不带零的整数n。爱丽丝和鲍勃正在用这个整数玩游戏。爱丽丝先开始。他们轮流玩游戏。
轮到Alice时,她必须交换位于不同位置的整数的任意两位数字。轮到鲍勃时,他总是去掉整数的最后一位。当只剩下一个数字时,游戏结束。
如果爱丽丝玩得很好,你必须找到她最终能得到的最小整数。
题目思路:如果是两位,直接输出个位,否则输出最小数字即可。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
cin.tie(0);
ios::sync_with_stdio(0);
int tc; cin>>tc;
while(tc--){
string s; cin>>s;
if(s.size()==2) cout<<s[1]<<endl;
else{
char ans='a';
for(int i=0;i<s.size();i++){
ans=min(ans,s[i]);
}
cout<<ans<<endl;
}
}
return 0;
}
//ACplease!!!
/* printf(" \n");
printf(" \n");
printf(" * * * * * * * * * * * * \n");
printf(" * * * * * * * * \n");
printf(" * * * * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * * * * * * * * * * * * * * * * * * * * \n");
*/
1684B - Z mod X = C
题目大意:
给你三个正整数a,b,c(a<b<c)。必须找到三个正整数x,y,z,以便:
x mod y=a,
y mod z=b,
z mod x=c。
这里,p mod q表示p除以q的余数。可以表明,对于此类约束,答案总是存在的。
题目思路:将z设定为最小值,那么x=a+b+c,y=b+c,y=c.数学题。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
cin.tie(0);
ios::sync_with_stdio(0);
int tc; cin>>tc;
while(tc--){
long long a,b,c; cin>>a>>b>>c;
cout<<a+b+c<<" "<<b+c<<" "<<c<<endl;
}
return 0;
}
//ACplease!!!
/* printf(" \n");
printf(" \n");
printf(" * * * * * * * * * * * * \n");
printf(" * * * * * * * * \n");
printf(" * * * * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * * * * * * * * * * * * * * * * * * * * \n");
*/
1108B - Divisors of Two Integers
题目大意:
最近您收到了两个正整数x和y。您忘记了它们,但您记得一个无序列表,其中包含x的所有除数(包括1和x)和y的所有除数(包括1和y)。如果d同时是数字x和y的除数,则列表中会出现两次d。
例如,如果x=4,y=6,那么给定的列表可以是列表的任何排列[1,2,4,1,2,3,6]。一些可能的列表是:[1,1,2,4,6,3,2]、[4,6,1,1,2,3,2]或[1,6,3,2,4,1,2]。
您的问题是恢复适当的正整数x和y,它们将产生相同的除数列表(可能是不同的顺序)。
可以保证答案存在,即给定的除数列表对应于一些正整数x和y。
题目思路:
方法一:第一个是最大值,第二个是去掉第一个的所有因数后的最大值。
方法二:第一个是最大值,第二个是第一个重复的因数或不是因数(最大)。
AC代码:
方法一:
#include<bits/stdc++.h>
using namespace std;
int main(){
cin.tie(0);
ios::sync_with_stdio(0);
int n; cin>>n;
set<int>se;
int a[130];
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
cout<<a[n-1]<<" ";
for(int i=0;i<n;i++){
if(se.count(a[i])==0&&a[n-1]%a[i]==0){
se.insert(a[i]);
a[i]=-1;
}
}
sort(a,a+n);
cout<<a[n-1];
return 0;
}
//ACplease!!!
/* printf(" \n");
printf(" \n");
printf(" * * * * * * * * * * * * \n");
printf(" * * * * * * * * \n");
printf(" * * * * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * * * * * * * * * * * * * * * * * * * * \n");
*/
方法二:
#include<bits/stdc++.h>
using namespace std;
int main(){
cin.tie(0);
ios::sync_with_stdio(0);
int n; cin>>n;
set<int>se;
int a[130];
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
cout<<a[n-1]<<" ";
for(int i=n-1;i>=0;i--){
if(se.count(a[i])==0&&a[n-1]%a[i]==0){
se.insert(a[i]);
}
else if(se.count(a[i])==1&&a[n-1]%a[i]==0){
cout<<a[i];
break;
}
else if(se.count(a[i])==0&&a[n-1]%a[i]){
cout<<a[i];
break;
}
}
return 0;
}
//ACplease!!!
/* printf(" \n");
printf(" \n");
printf(" * * * * * * * * * * * * \n");
printf(" * * * * * * * * \n");
printf(" * * * * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * * * * * * * * * * * * * * * * * * * * \n");
*/
1612B - Special Permutation
题目大意:
长度为n的置换是一个数组p=[p1,p2,…,pn],其中包含从1到n(包括1到n)的每个整数,且只包含一次。例如,p=[4,2,6,5,3,1]是长度为6的置换。
给你三个整数n,a和b,其中n是偶数。打印长度为n的任何排列,左半部分所有元素中的最小值等于a,右半部分所有元素中的最大值等于b。如果不存在这种排列,请打印-1。
题目思路:构造题,分别定义两个数组构造两个部分,先考虑<a的和>b的,再考虑两数之间的。
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
int main(){
cin.tie(0);
ios::sync_with_stdio(0);
int tc; cin>>tc;
label:
while(tc--){
int n,a,b; cin>>n>>a>>b;
vector<int>l;
vector<int>r;
l.pb(a); r.pb(b);
for(int i=1;i<=n;i++){
if(i!=a&&i!=b){
if(i<a&&i>b){
cout<<-1<<endl;
goto label;
}
if(i<a) r.pb(i);
if(i>b) l.pb(i);
}
}
if(r.size()>n/2||l.size()>n/2){
cout<<-1<<endl;
goto label;
}
for(int i=a+1;i<b;i++){
if(l.size()<n/2) l.pb(i);
else r.pb(i);
}
for(int i=0;i<n/2;i++) cout<<l[i]<<" ";
for(int i=0;i<n/2;i++) cout<<r[i]<<" ";
cout<<endl;
}
return 0;
}
//ACplease!!!
/* printf(" \n");
printf(" \n");
printf(" * * * * * * * * * * * * \n");
printf(" * * * * * * * * \n");
printf(" * * * * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * \n");
printf(" * * * * * * * * * * * * * * * * * * * * * * * * \n");
*/