本来说这周点杭电科技树的,但是cf都没有上分,先上分,但是...
(其实我怀疑是不是目前能力还点不起来...)
A
唯一一道写出来的,模拟
B
最少,贪心,把最多的一半全拿了,另一半把最大的k-1组拿了,最后ans++,因为再拿一个肯定凑齐k种颜色
点击查看代码
/*
思维的问题:
找到最少x个手套满足k对匹配
正向考虑而不是反向思考
最少就是考虑最坏最优情况
思路:
最多能拿多少个手套,使得条件成立?
*/
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n, k; cin >> n >> k;
vector<int> l(n), r(n);
long long ans = 0;
for(int i = 0; i < n; i++) cin >> l[i];
for(int i = 0; i < n; i++) {
cin >> r[i];
if(l[i]>r[i])swap(l[i],r[i]);
ans += r[i];
}
sort(l.begin(), l.end(), greater<>());
for(int i = 0; i < k-1; i++) ans += l[i];
ans++;
cout << ans << '\n';
}
int main(){
int t; cin >> t;
while(t--){
solve();
}
return 0;
}
考虑第ri和ri+1行,
如果ri,j = ri+1,j,则选择一行操作,
如果存在ri,j + 1 = ri+1,j,则不能在第i+1行操作,否则相邻相同,寄
同理,不能在第i行操作的情况:ri,j = ri+1,j + 1:
如果同时存在三种情况,无解返回-1
定义:dp[i][0/1]:第i行用/不用工人的费用
转移:
1.总情况共四种,00,01,10,11
由于dp时只考虑相邻状态如何转移,从什么状态来?想i和i-1的状态
i-1选/不选 -> i选/不选
2.形式化: i, j -> i+1, j2
f[i+1][j2] = min(f[i][j], f[i][j] + j2 ? cost[i] : 0)
3.非法转移判断:
经过前面的分析,存在无法转移的情况,可以使用状态定义这几种情况,然后分类讨论,dp时忽略
详细看代码(没错又是贴的)
点击查看代码
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
#if !defined(ONLINE_JUDGE) && defined(LOCAL)
#include "helper.h"
#else
#define dbg(...) ;
#define local_go_m(x) int c;cin>>c;while(c--)x()
#endif
void go() {
int n;
cin >> n;
vector a(n, vector<int>(n));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> a[i][j];
}
}
vector<int> h(n), v(n);
for (int i = 0; i < n; i++) cin >> h[i];
for (int i = 0; i < n; i++) cin >> v[i];
auto calc = [&](vector<vector<int>> &a, vector<int> &cost) -> i64 {
vector<int> d(n - 1, 0);
// 1: 1 2: 1 4: 2
// 1 2 1
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n; j++) {
if (a[i][j] == a[i + 1][j]) d[i] |= 1;
else if (a[i][j] + 1 == a[i + 1][j]) d[i] |= 2;
else if (a[i][j] - 1 == a[i + 1][j]) d[i] |= 4;
}
}
i64 inf = 0x3f3f3f3f3f3f3f3fll;
vector<array<i64, 2>> f(n, {inf, inf});
f[0][0] = 0;
f[0][1] = cost[0];
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < 2; j++) {
if (f[i][j] >= inf) continue;
for (int j2 = 0; j2 < 2; j2++) {
if ((d[i] & 1) && j == j2) continue;
if ((d[i] & 2) && j && !j2) continue;
if ((d[i] & 4) && !j && j2) continue;
f[i + 1][j2] = min(f[i + 1][j2], f[i][j] + (j2 ? cost[i + 1] : 0));
}
}
}
i64 res = min(f[n - 1][0], f[n - 1][1]);
if (res >= inf) return -1;
return res;
};
auto b = a;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
b[i][j] = a[j][i];
i64 r1 = calc(a, h);
i64 r2 = calc(b, v);
if (r1 == -1 || r2 == -1) {
cout << -1 << endl;
} else {
cout << r1 + r2 << endl;
}
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
local_go_m(go);
return 0;
}
点击查看代码
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
#if !defined(ONLINE_JUDGE) && defined(LOCAL)
#include "helper.h"
#else
#define dbg(...) ;
#define local_go_m(x) int c;cin>>c;while(c--)x()
#endif
void go() {
int n;
cin >> n;
int resx = 0, xy = 0;
for (int i = 0; i < n; i++) {
int x, y;
cin >> x >> y;
resx ^= x;
xy ^= x + y;
}
cout << resx << " " << xy - resx << endl;
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
local_go_m(go);
return 0;
}
我一直在想是不是别玩了,基本都不会...

浙公网安备 33010602011771号