传送门:https://www.cometoj.com/contest/52
A:签到题
题意:多次询问,每次询问给出一个值域区间[l,r],从这区间范围中选出两个整数(可重复),依次求出这俩数的“最大的最小公倍数”、“最小的最小公倍数”、“最大的最大公约数”、最小的最大公约数。
分析:(1)显然,当区间长度为1时,该问题的答案只能是区间中仅有的那个数。
(2)当区间的长度大于1时,最大的最小公倍数,lcmmax =lcm(ar,ar-1) = ar * ar-1;
最小的最小公倍数,lcmmin = lcm(al,al) = al;
最大的最大公约数,gcdmax = gcd(ar,ar) = ar;
最小的最大公约数,gcdmin = gcd(ar,ar-1) = 1;
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int main() { 6 int t; 7 scanf("%d",&t); 8 while (t--) { 9 int l,r; 10 scanf("%d%d",&l,&r); 11 12 if (l == r) { 13 printf("%d %d %d %d\n",l,l,l,l); 14 } else { 15 printf("%lld %d %d %d\n",(long long)r*(r-1),l,r,1); 16 } 17 } 18 19 return 0; 20 }
B:麻将题
题意:4个人(编号为1~4)围成一个环,相邻两人可以交换位置。现按逆时针顺序给出环上的编号,代表4人在桌上的位置关系。求最少需要交换多少次位置才能满足1的下一个元素是2,2的下一个元素是3,3的下一个元素是4,4的下一个元素是1。
分析:由于环上只有4个元素,交换次数最多不会超过2次,因此我们可以考虑直接枚举情况。
(1)假如这个序列一开始就满足条件,最少交换次数为 0。
(2)假如这个序列的位置关系为(1,4,3,2),最少交换次数为 2。
(3)其余情况最少交换次数均为 1。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int main() { 6 int num[4],pos = 0; 7 for (int i=0;i<4;i++) { 8 scanf("%d",&num[i]); 9 if (num[i] == 1) 10 pos = i; 11 } 12 13 int arr[4]; 14 int pick[4] = {1,4,3,2}; 15 bool two = true; 16 for (int i = 0;i<4;i++) { 17 arr[i] = num[pos]; 18 pos = (pos + 1)%4; 19 if (arr[i] != pick[i]) { 20 two = false; 21 } 22 } 23 24 if (two) { 25 puts("2"); 26 } else { 27 int i = 1; 28 for (;i<4;i++) { 29 if (arr[i] != arr[i-1] + 1) { 30 break; 31 } 32 } 33 if (i == 4) { 34 puts("0"); 35 } else { 36 puts("1"); 37 } 38 } 39 40 return 0; 41 }
原文地址:https://www.cnblogs.com/doublebit/p/11348040.html
时间: 2024-11-08 08:32:02