Codeforces Round #401 (Div. 2)

A

可以發現是有周期的, 第一次操作無論如何都是進行左中操作, 第二次也是無論如何都是進行中右操作

所以枚舉地點位置即可.

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <utility>

using namespace std;
typedef long long ll;
const int qq = 1e5 + 10;
#define pill pair<int, int>
int n, m;
int k;
int p1[] = {0, 1, 2, 2, 1, 0};
int p2[] = {1, 0, 0, 1, 2, 2};
int p3[] = {2, 2, 1, 0, 0, 1};

int main(){
	scanf("%d", &n);
	scanf("%d", &k);
	n = n % 6;
	if(p1[n] == k)	printf("0\n");
	if(p2[n] == k)	printf("1\n");
	if(p3[n] == k)	printf("2\n");
	return 0;
}

B

兩種策略不一樣.

第一種要求輸的最少次數

第二種要求贏的最多次數

那麼很顯然, 第一種是要盡可能保存自己手中的較大的數去比對方的小數

第二種是盡可能的要贏, 那麼就要用盡可能小的數去贏

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <utility>

using namespace std;
typedef long long ll;
const int qq = 1e3 + 10;
#define pill pair<int, int>
int n, m;
int x[15], y[15];
char st[qq];

int main(){
	scanf("%d", &n);
	scanf("%s", st);
	for(int i = 0; i < (int)strlen(st); ++i)
		x[st[i] - '0']++;
	scanf("%s", st);
	for(int i = 0; i < (int)strlen(st); ++i)
		y[st[i] - '0']++;
	int maxn = 0;
	int p = 0;
	for(int i = 9; i >= 0; --i){
		if(y[i] < x[i]){
			maxn += y[i];
			int c = x[i] - y[i];
			if(c > p)	maxn += p, p = 0;
			else	maxn += c, p -= c;
		}
		else	maxn += x[i], p += y[i] - x[i];
//		printf("%d %d\n", maxn, p);
	}
	maxn = n - maxn;
	int minx = 0;
	p = 0;
//	printf("%d\n", p);
	for(int i = 1; i <= 9; ++i){
		if(y[i] > x[i - 1]){
			minx += x[i - 1];
			int c = y[i] - x[i - 1];
			if(p > c)	minx += c, p -= c;
			else	minx += p, p = 0;
		}	
		else	minx += y[i], p += x[i - 1] - y[i];
//		printf("%d %d\n", minx, p);
	}
	printf("%d\n%d\n", maxn, minx);
	return 0;
}

C

這題比賽的時候沒想出來...

每次都能想到邊上去, 就是走不到正解的道路上

dp[i] 代表以i爲起點最長非遞減序列長度,

那麼dp[a] >= x - y + 1就是Yes, 否則就是No

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <utility>

using namespace std;
typedef long long ll;
typedef pair<int, int> pill;
const int qq = 1e5 + 10;
int n, m;
int dp[qq];
vector<int> vt[qq];
int main(){
	memset(dp, 0, sizeof(dp));
	scanf("%d%d", &n, &m);
	int x;
	for(int i = 0; i < n; ++i)
		for(int j = 0; j < m; ++j){
			scanf("%d", &x);
			vt[i].push_back(x);
		}
	for(int j = 0; j < m; ++j){
		int pre = vt[0][j];
		int cnt = 1;
		int start = 0;
		for(int i = 1; i < n; ++i){
			if(vt[i][j] >= pre){
				cnt++, pre = vt[i][j];
			}else{
				dp[start] = max(dp[start], cnt);
				pre = vt[i][j];
				start = i;
				cnt = 1;
			}
		}
		dp[start] = max(dp[start], cnt);
	}
	for(int i = 1; i < n; ++i)	dp[i] = max(dp[i], dp[i - 1] - 1);
	int q;	scanf("%d", &q);
	while(q--){
		int x, y;	scanf("%d%d", &x, &y);
		x--, y--;
		if(dp[x] >= y - x + 1){
			puts("Yes");
		}else{
			puts("No");
		}
	}
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值