200天1000题 (DAY 6)

200天1000题 (DAY 6)

目前总题数: 26

目前CF分数: 1325

T1 (Codeforces #821 DIV. 2) A - Consecutive Sum

/*
	比较简单的一题。
*/
 
const int N = 1e6 + 10;
 
 
 
inline void sensei()
{
    int n,k;
    cin >> n >> k;
    vector<int> a(n+1);
    vector<int> ans(n+1,-inf_ll);
    for(int i=0;i<n;i++){
        cin >> a[i];
    }
    for(int i=0;i<n;i++){
        ans[i%k] = max(ans[i%k],a[i]);
    }
    int ret = 0;
    for(int i=0;i<k;i++){
        ret += ans[i];
    }
    cout << ret << endl;
}
 
signed main()
{
    fuckios
    int t;
    cin >> t;
    while(t --)
    {
        sensei();
    }
    return 0;
}

T2 (Codeforces #821 DIV. 2) B - Rule of League

/*
	题目大意:给你三个数字 n,x,y
	表示一共有n个人要来打羽毛球比赛
	比赛规则如下, 第一个人先和第二个人打一轮
	胜者和第三人打一轮,以此类推直到和第n人进行了比赛,现在,x,y表示每个人要么赢了x场要么赢了y场,请问每一轮的胜者的编号?(如果x,y对于这样的比赛不合理,输出-1)
	
	结论题
*/


const int N = 1e6 + 10;
 
 
 
inline void sensei()
{
    int n,x,y;
    cin >> n >> x >> y;
    if(x > y) swap(x,y);
    if(x!=0) {
        puts("-1");
        return ;
    }
    if(y == 0 or (n-1)%y!=0){
        cout << -1 << endl;
        return ;
    }
    int ans;
    for(int i=0;i<n-1;i++){
        ans = i-i%y+2 ;
        cout << ans << ' ';
    }
    cout << endl;
}
 
signed main()
{
    int t;
    cin >>t;
    while(t --){
        sensei();
    }
    return 0;
}

T3 (Codeforces #821 DIV. 2) C - Parity Shuffle Sorting

/*
	贪心,构造
*/

struct node {
	int x;
	int y;
};

const int N = 1e6 + 10;



inline void sensei()
{
	int n;
	cin >> n;
	vector<node> ans; // 存答案
	vector<int> a(n + 1);
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	if (n == 1) {
        // 特判 1
		cout << 0 << endl;
		return ;
	}
	if ((a[0] + a[n-1]) % 2 == 0) {
        // 如果 第一个和最后一个同奇或同偶 那么直接令最后一个等于第一个
		a[0] = a[n - 1];
		ans.push_back({0, n - 1});
	}

	for (int i = 1; i < n; i++) {
        // 从下标1开始遍历
        // 如果有a[i] + a[0] ==  even 的数
        // 直接赋值
		if ((a[0] % 2) != (a[i] % 2)) {
			ans.push_back({0, i});
			a[i] = a[0];
		}
	}

	for (int i = n - 2; i >= 0; i--) {
        // 同理 倒着遍历一边
		if (a[i] != a[n - 1]) {
			ans.push_back({i, n - 1});
			a[i] = a[n - 1];
		}
	}
    
    // 输出答案
	cout << ans.size() << endl;
	for (int i = 0; i < ans.size(); i++) {
		cout << ans[i].x + 1 << ' ' << ans[i].y + 1 << endl;
	}
}

signed main()
{
	fuckios
	int t;
	cin >> t;
	while (t --) {
		sensei();
	}
	return 0;
}

T4 (Codeforces #821 DIV. 2) D1. Zero-One (Easy Version)

/*
	贪心,结论
*/


inline void sensei()
{
	int n, x, y;
	cin >> n >> x >> y;
	vector<int> c(n + 1);
	vector<int> a(n + 1);
	vector<int> b(n + 1);
	int cnt = 0;
	for (int i = 1; i <= n; i++) {
		char alls;
		cin >> alls;
		a[i] = alls - '0';
	}
	for (int i = 1; i <= n; i++) {
		char alls;
		cin >> alls;
		b[i] = alls - '0';
	}
	for (int i = 1; i <= n; i++) {
		if (a[i] != b[i] and (a[i] == 1 or b[i] == 1)) {
			c[i] = 1;
			cnt++;
		}
	}
	if (cnt & 1) {
		cout << -1 << endl;
		return ;
	}
	int ans = 0;
	if (cnt == 2) {
		int l, r;
		l = 1, r = n;
		while (c[l] == 0) {
			l ++;
		}
		while (c[r] == 0) {
			r --;
		}
        debug(l);
        debug(r);
        
		if (l + 1 == r) {
			ans = min(2 * y, x);
		} else {
			ans = min((r - l) * x, y);
		}
	} else {
		ans = (cnt / 2) * y;
	}
	cout << ans << endl;
}

signed main()
{
#ifndef LOCAL
	fuckios
#endif

	int t;
    cin >> t;
    
	while (t--) {
		sensei();
	}

	return 0;
}

T5 (Codeforces #771 DIV. 2) Odd Swap Sort

/*
	题意:
		给你一个大小为n的数组,你可以对这个数组进行任意如下操作:
		操作:当 a[i] + a[i+1] 是一个奇数 那么你可以交换a[i] 和 a[i+1] 的值
		
		问:是否能够通过任意次操作把给你的数组变为一个不下降数组
*/ 

/*
	题解:
		主要是观察到一个很好的性质
		只有a[i]+a[i+1] 是一个奇数才能交换,这就说明 a[i]和a[i+1]必须是不同的奇偶性
		所以 偶数和偶数永远无法交换,奇数和奇数也是永远无法交换
		这样,所有偶数的相对位置就永远不变,所有奇数的相对位置也永远不变
		因此我们只需要开两个数组 odd 和 even 记录一下奇数和偶数(按顺序)
		并且检查一下他们是否不下降即可
*/


bool check(vector<int> nums){
    for(int i=0;i<nums.size()-1;i++){
        if(nums.size() == 0) return true;
        if(nums[i] > nums[i+1]){
            return false;
        }
    }
    return true;
}
 
inline void sensei()
{
    int n;
    cin >> n;
    vector<int> a(n+1);
    vector<int> odd,even;
    for(int i=1;i<=n;i++){
        cin >> a[i];
        if(a[i]&1)
            odd.emplace_back(a[i]);
        else
            even.emplace_back(a[i]);
    }
    
    if(check(odd) and check(even)) cout << "YES" << endl;
    else cout << "NO" << endl;
    
}
 
signed main()
{
#ifndef LOCAL
    fuckios
#endif
    
    int t;
    cin >> t;
    while(t --){
        sensei();
    }
    
    return 0;
}
posted @ 2022-09-20 22:24  coolJazz  阅读(22)  评论(0)    收藏  举报