Codeforces Round 1023 (Div. 2)

目录

A. LRC and VIP

题目:​编辑

代码:

无注释版:

有注释版:

B. Apples in Boxes

题目:​编辑

代码:

无注释版:

有注释版:


A. LRC and VIP

题目:

代码:

无注释版:

#include<bits/stdc++.h>
using namespace std;
int a[110];
int main(){
	int t;
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i]; 
		}
		int x=a[1];
		for(int i=2;i<=n;i++){
			x=__gcd(x,a[i]);
		}
		int p=0,f=0;
		for(int i=1;i<=n;i++){
			if(a[i]!=x){
				p=i;
				f=1;
				break;
			}
		}
		if(f==0){
			cout<<"NO\n";
		}
		else{
			cout<<"YES\n";
			for(int i=1;i<=n;i++){
				if(i==p){
					cout<<"2 ";
				}
				else cout<<"1 ";
			}
			cout<<"\n";
		}
	}
} 

有注释版:

#include<bits/stdc++.h> // 引入C++标准库头文件,包含常用的功能,比如输入输出、算法等
using namespace std;

int a[110]; // 定义一个大小为110的数组a,用来存储每个测试用例中的元素

int main() {
    int t; // 定义变量t来存储测试用例的数量
    cin >> t; // 输入测试用例的数量
    
    // 对每个测试用例进行处理
    while(t--) {
        int n; // 定义n,用来存储当前测试用例中数组a的大小
        cin >> n; // 输入n
        
        // 输入数组a的n个元素
        for(int i = 1; i <= n; i++) {
            cin >> a[i]; 
        }

        // 计算数组a所有元素的最大公约数(GCD)
        int x = a[1]; // 初始时x取数组的第一个元素
        for(int i = 2; i <= n; i++) {
            x = __gcd(x, a[i]); // 计算当前x与a[i]的GCD
        }

        int p = 0, f = 0; // 定义变量p和f,p用于记录找到第一个不等于x的元素的索引,f用于标记是否找到该元素
        // 遍历数组,找到第一个不等于x的元素
        for(int i = 1; i <= n; i++) {
            if(a[i] != x) { // 如果当前元素不等于x
                p = i; // 将该元素的索引赋给p
                f = 1; // 设置f为1,表示找到了不等于x的元素
                break; // 找到第一个不等于x的元素后,退出循环
            }
        }

        // 如果没有找到不等于x的元素
        if(f == 0) {
            cout << "NO\n"; // 如果所有元素的GCD相同,输出"NO"
        } else {
            cout << "YES\n"; // 如果找到了不同的GCD,输出"YES"
            // 输出一个序列,表示如何分组
            // 将第p个元素单独分组为序列B,其余的分配到序列C
            for(int i = 1; i <= n; i++) {
                if(i == p) {
                    cout << "2 "; // 第p个元素归为序列C,输出2
                } else {
                    cout << "1 "; // 其余元素归为序列B,输出1
                }
            }
            cout << "\n"; // 输出换行
        }
    }
}

B. Apples in Boxes

题目:

代码:

无注释版:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[200010];
signed main(){
	int t;
	cin>>t;
	while(t--){
		int n,k;
		cin>>n>>k;
		int s=0;
		map<int,int> mp;
		mp.clear();
		for(int i=1;i<=n;i++){
			cin>>a[i];
			s+=a[i];
			mp[a[i]]++;
		}
		sort(a+1,a+n+1);
		if(a[n]-1-a[1]>k){
			cout<<"Jerry\n";
			continue;
		}
		if(a[n]-1-a[1]==k){
			if(mp[a[n]]>1){
				cout<<"Jerry\n";
				continue;
			}
		} 
		if(s%2==0){
			cout<<"Jerry\n";
		}
		else cout<<"Tom\n";
	} 
} 

有注释版:

#include<bits/stdc++.h>  // 引入所有标准库,方便使用各种容器和算法
using namespace std;  // 使用标准命名空间

#define int long long  // 定义int为long long,避免溢出

int a[200010];  // 声明一个数组a,最大大小为200010,用来存储每个盒子里的苹果数量

signed main() {  // 主函数
    int t;  // t是测试用例的数量
    cin >> t;  // 输入测试用例的数量

    while (t--) {  // 遍历每个测试用例
        int n, k;  // n是盒子数量,k是限制条件中的最大差值
        cin >> n >> k;  // 输入n和k

        int s = 0;  // s用来计算苹果的总数
        map<int, int> mp;  // 使用map记录每种苹果数量出现的次数,mp[a[i]]表示苹果数量为a[i]的盒子数目

        mp.clear();  // 清空map
        for (int i = 1; i <= n; i++) {  // 遍历每个盒子
            cin >> a[i];  // 输入每个盒子中的苹果数量
            s += a[i];  // 累加总苹果数
            mp[a[i]]++;  // 记录当前苹果数量出现的次数
        }

        sort(a + 1, a + n + 1);  // 对数组a进行排序,从小到大

        // 如果最大值减去最小值大于k,游戏结束,Jerry胜
        if (a[n] - 1 - a[1] > k) {  
            cout << "Jerry\n";  // Jerry获胜
            continue;  // 跳出当前测试用例
        }

        // 如果最大值减去最小值恰好等于k,并且最大值的数量超过1,游戏结束,Jerry胜
        if (a[n] - 1 - a[1] == k) {  
            if (mp[a[n]] > 1) {  // 如果最大值出现超过一次
                cout << "Jerry\n";  // Jerry获胜
                continue;  // 跳出当前测试用例
            }
        }

        // 如果苹果总数为偶数,Jerry胜,否则Tom胜
        if (s % 2 == 0) {  
            cout << "Jerry\n";  // 如果总数是偶数,Jerry胜
        } else {
            cout << "Tom\n";  // 如果总数是奇数,Tom胜
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值