2022年5月21日刷题

12 篇文章 0 订阅
12 篇文章 1 订阅

晚上要打ABC,赶紧热身一下。

目录

1684A - Digit Minimization

1684B - Z mod X = C

1108B - Divisors of Two Integers

1612B - Special Permutation


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");
*/    

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值