Codeforces Round 860 (Div. 2) A-E

题目链接:https://codeforces.com/contest/1798

A - Showstopper

解题思路:小的放一边大的放一边

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)|1
typedef long long ll;
using ull = unsigned long long;
const int mx = 2e3 + 10;
const int mod = 1e9 + 7;

int a[mx], b[mx];

int main() {
	int t;
	scanf("%d", &t);
	auto solve = [](int n) {
		for (int i=1;i<=n;i++)
			if (a[i] == '1')
				return i;
		return -1;
	};
	while (t--) {
		int n;
		scanf("%d", &n);
		for (int i=1;i<=n;i++) {
			scanf("%d", a+i);
		}
		for (int i=1;i<=n;i++) {
			scanf("%d", b+i);
		}
		int m1 = 0, m2 = 0;
		for (int i=1;i<=n;i++) {
			if (a[i] > b[i])
				swap(a[i], b[i]);
			m1 = max(m1, a[i]);
			m2 = max(m2, b[i]);
		}
		if (m1 == a[n] && m2 == b[n])
			puts("yes");
		else
			puts("no");
	}
	
	return 0;
}

B - Three Sevens

解题思路:模拟一下

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)|1
typedef long long ll;
using ull = unsigned long long;
const int mx = 5e4 + 10;
const int mod = 1e9 + 7;

vector <int> vec[mx];
map <int,int> mp;

int main() {
	int t;
	scanf("%d", &t);
	auto solve = [](vector <int> &ans, int m) {
		for (int i=1;i<=m;i++) {
			for (int v: vec[i]) {
				mp[v]--;
				if (ans.size() != i && mp[v] == 0)
					ans.push_back(v);
			}
			if (ans.size() != i)
				return 0;
		}
		return 1;
	};
	while (t--) {
		mp.clear();
		int m, n;
		scanf("%d", &m);
		for (int i=1;i<=m;i++) {
			vec[i].clear();
			scanf("%d", &n);
			for (int j=1;j<=n;j++) {
				int v;
				scanf("%d", &v);
				vec[i].push_back(v);
				mp[v]++;
			}
		}
		vector <int> ans;
		if (solve(ans, m)) {
			for (int v: ans)
				printf("%d ", v);
			puts("");
		} else
			puts("-1");
	}
	
	return 0;
}

C - Candy Store

解题思路:算一下除数和被除数的gcd是否能整除不能就++。

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)|1
typedef long long ll;
using ull = unsigned long long;
const int mx = 2e5 + 10;
const int mod = 1e9 + 7;

ll a[mx], b[mx];
int n;


int main() {
	int t;
	scanf("%d", &t);
	auto solve = [](vector <int> &ans, int m) {
	};
	while (t--) {
		scanf("%d", &n);
		ll now_gcd, val;
		int ans = 1;
		for (int i=1;i<=n;i++) {
			scanf("%d%d", a+i, b+i);
			if (i == 1) now_gcd = a[i] * b[i], val = b[i];
			else {
				now_gcd = __gcd(now_gcd, a[i] * b[i]);
				val = val * b[i] / __gcd(val, b[i]);
				if (now_gcd % val != 0) {
					ans++;
					now_gcd = a[i] * b[i];
					val = b[i];
				}
			}
		}
		printf("%d\n", ans);
	}
	
	return 0;
}

D - Shocking Arrangement

解题思路:贪心一下,让前缀和交替负数和正数,那么任意的区间就不会超过最大值减去最小值。

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)|1
typedef long long ll;
using ull = unsigned long long;
const int mx = 3e5 + 10;
const int mod = 1e9 + 7;

ll a[mx], b[mx];
int n;
vector <int> v1, v2;

int main() {
	int t;
	scanf("%d", &t);
	auto solve = [](vector <int> &ans, int m) {
	};
	while (t--) {
		scanf("%d", &n);
		v1.clear();
		v2.clear();
		for (int i=1;i<=n;i++) {
			int v;
			scanf("%d", &v);
			if (v < 0)
				v1.push_back(v);
			else if (v > 0)
				v2.push_back(v);
		}
		if (v1.size() == 0) {
			puts("no");
			continue;
		}
		puts("yes");
		sort(v1.begin(), v1.end());
		sort(v2.begin(), v2.end(), greater<int>());
		int id1 = 0, id2 = 0;
		for (int i=0; i<n-v1.size()-v2.size(); i++)
			printf("0 ");
		ll sum = 0;
		while (id1 < v1.size() && id2 < v2.size()) {
			if (sum <= 0) {
				printf("%d ", v2[id2]);
				sum += v2[id2++];
			} else {
				printf("%d ", v1[id1]);
				sum += v1[id1++];
			}
		}
		while (id1 < v1.size())
			printf("%d ", v1[id1++]);
		while (id2 < v2.size())
			printf("%d ", v2[id2++]);
		puts("");
	}
	
	return 0;
}

E - Multitest Generator

解题思路:容易知道最多操作次数不超过2,也就是改掉,i,和a[i+1]的值就行了。0的情况也很好判断,令vis[i]为i~n的连续次数,那么a[i] == vis[i+1]答案就为0。1的情况就有几种了,一种是该i的值,当vis[i+1]连续,一种是该a[i+1]的值,令a[i] <= ma[i+1],这里令ma[i]令i~n连续的最大值。还有一种情况是改变i + a[i] + 1的值,因为vis[i+1]不连续,那么如果i+1+a[i+1]<=n,那么vis[i+1+a[i+1]+1]肯定也是不连续的,因此还可以不改变i+1的值,该i + a[i] +1的值。

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)|1
typedef long long ll;
using ull = unsigned long long;
const int mx = 3e5 + 10;
const int mod = 1e9 + 7;

int a[mx], ans[mx];
int vis[mx], ma[mx];
int n;

int main() {
	int t;
	scanf("%d", &t);
	auto solve = [](vector <int> &ans, int m) {
	};
	while (t--) {
		scanf("%d", &n);
		for (int i=1;i<=n;i++) {
			scanf("%d", a + i);
		}
		ma[n+1] = vis[n+1] = 0;
		for (int i=n; i; i--) {
			if (i + a[i] > n || vis[i + a[i] + 1] == -1) {
				vis[i] = -1;
			}
			else {
				vis[i] = vis[i + a[i] + 1] + 1;
			}
			ma[i] = max(vis[i], ma[i+1]);
		}
		for (int i=n;i;i--) {
			if (vis[i] == -1) {
				ma[i] = ma[i] + 1;
				if (i + a[i] <= n)
					ma[i] = max(ma[i], ma[i + a[i] + 1] + 1);
			}
		}
		for (int i=1;i<n;i++) {
			if (a[i] == vis[i+1]) {
				printf("0 ");
			} else if (vis[i+1] == -1) {
				if (a[i] <= ma[i+1])
					printf("1 ");
				else
					printf("2 ");
			} else {
				printf("1 ");
			}
		}
		puts("");
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值