Contest链接:CF #243(Div. 2) (426)
补题完毕,此文存代码。
// A . Sereja and Mugs
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int a[111];
int main()
{
// freopen("in", "r", stdin);
int n, s, sum = 0;
scanf("%d%d", &n, &s);
for(int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
sum += a[i];
}
bool flag = 0;
for(int i = 0; i < n; ++i) {
if(sum - a[i] <= s) {
flag = 1;
break;
}
}
printf("%s\n", flag ? "YES" : "NO");
return 0;
}
// B . Sereja and Mirroring
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 111, inf = 1111111;
int mat[N][N];
char s[N][N];
int judge(int i, int k)
{
if(k == 1) return inf;
if(k & 1) return inf;
for(int j = i; j < k / 2; ++j) {
if(strcmp(s[j], s[i + k - 1 - j])) return inf;
}
return min(k, min(judge(i, k / 2), judge(k / 2 + 1, i + k - 1)));
}
int main()
{
// freopen("in", "r", stdin);
int n, m;
scanf("%d%d", &n, &m);
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j) {
scanf("%d", &mat[i][j]);
s[i][j] = mat[i][j] + '0';
}
s[i][m] = '\0';
}
printf("%d\n", min(n, judge(0, n) / 2));
return 0;
}
// C . Sereja and Swaps
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
const int N = 222, inf = (int)1e9;
int a[N];
vector<int> seg(N), tem(N);
bool cmp(const int &a, const int &b) { return a > b; }
int main()
{
// freopen("in", "r", stdin);
int n, k;
scanf("%d%d", &n, &k);
for(int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
int mx = -inf;
for(int i = 0; i < n; ++i) {
for(int j = i; j < n; ++j) {
int sum = 0;
for(int x = i; x <= j; ++x) sum += a[x];
seg.clear(), tem.clear();
for(int x = 0; x < i; ++x) tem.push_back(a[x]);
for(int x = i; x <= j; ++x) seg.push_back(a[x]);
for(int x = j + 1; x < n; ++x) tem.push_back(a[x]);
sort(seg.begin(), seg.end());
sort(tem.begin(), tem.end(), cmp);
int siz_s = seg.size(), siz_t = tem.size();
for(int x = 0; x < k && x < siz_s && x < siz_t && tem[x] > seg[x]; ++x) {
sum += tem[x] - seg[x];
}
if(sum > mx) mx = sum;
}
}
printf("%d\n", mx);
return 0;
}
// D . Sereja and Table
#include <algorithm>
#include <cstdio>
using namespace std;
const int N = 111, inf = (int)1e9;
int a[N][N], c[N];
int main()
{
// freopen("in", "r", stdin);
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j) {
scanf("%d", &a[i][j]);
}
}
int mx = inf;
if(n > k) {
for(int i = 0; i < n; ++i) {
int tans = 0;
for(int j = 0; j < n; ++j) {
int t = 0;
for(int x = 0; x < m; ++x) {
t += (a[i][x] == a[j][x]);
}
tans += min(t, m - t);
}
mx = min(mx, tans);
}
}
else {
for(int i = 0; i < (1 << n); ++i) {
for(int j = 0; j < n; ++j) c[j] = (i >> j) & 1;
int tans = 0;
for(int x = 0; x < m; ++x) {
int t = 0;
for(int y = 0; y < n; ++y) {
t += (c[y] == a[y][x]);
}
tans += min(t, n - t);
}
mx = min(mx, tans);
}
}
printf("%d\n", mx <= k ? mx : -1);
return 0;
}
// E . Sereja and Two Sequences
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;
const int N = 111111;
vector<int> v[N];
int a[N], dp[N], ans;
int main()
{
// freopen("in", "r", stdin);
int n, m, s, e, b;
scanf("%d%d%d%d", &n, &m, &s, &e);
for(int i = 0; i < n; ++i) scanf("%d", &a[i]);
for(int i = 0; i < m; ++i) scanf("%d", &b), v[b].push_back(i);
memset(dp, 0x3f, sizeof dp);
dp[0] = -1;
for(int i = 0; i < n; ++i) {
for(int j = s / e; j >= 1; --j) {
vector<int>::iterator it = upper_bound(v[a[i]].begin(), v[a[i]].end(), dp[j - 1]);
if(it == v[a[i]].end()) continue;
dp[j] = min(*it, dp[j]);
if(i + 1 + dp[j] + 1 + j * e <= s) ans = max(j, ans);
}
}
printf("%d\n", ans);
return 0;
}