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;
}