Codeforces Round #556 (Div. 2)
A
贪心
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#include <set>
using namespace std;
const int N = 1005;
int a[N], b[N];
int n, m, bou, res;
inline bool rule(int x, int y){
return x > y;
}
int main(){
scanf("%d%d%d", &n, &m, &bou);
for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
for(int i = 1; i <= m; ++i) scanf("%d", &b[i]);
sort(a + 1, a + n + 1); sort(b + 1, b + m + 1, rule);
int cnt = b[1] > a[1] ? bou / a[1] : 0;
res = cnt * b[1] - cnt * a[1] + bou;
printf("%d", res);
return 0;
}
B
贪心。。
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#include <set>
using namespace std;
const int N = 55;
int n;
bool map[N][N], col[N][N];
inline void print(int x, int y){
if(!(map[x][y] & map[x + 1][y] & map[x + 1][y - 1]
& map[x + 1][y + 1] & map[x + 2][y])){
printf("NO\n"); exit(0);
}
map[x][y] = map[x + 1][y] = map[x + 1][y - 1]
= map[x + 1][y + 1] = map[x + 2][y] = 0;
}
int main(){
scanf("%d", &n);
char str[N];
for(int i = 1; i <= n; ++i){
scanf("%s", str + 1);
for(int j = 1; j <= n; ++j){
map[i][j] = (str[j] == '.');
}
}
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= n; ++j){
if(map[i][j]) print(i, j);
}
}
printf("YES\n");
return 0;
}
C
贪心??。。。
先放2 再放1 再放所有2 再放所有1
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#include <set>
using namespace std;
int n, cnt1, cnt2;
int main(){
scanf("%d", &n);
for(int i = 1, x; i <= n; ++i){
scanf("%d", &x);
if(x == 1) ++cnt1; else ++cnt2;
}
if(cnt1 == 0){
for(int i = 1; i <= cnt2; ++i) putchar('2'), putchar(' ');
return 0;
}
if(cnt2 == 0){
for(int i = 1; i <= cnt1; ++i) putchar('1'), putchar(' ');
return 0;
}
putchar('2'), putchar(' '), putchar('1'), putchar(' ');
for(int i = 2; i <= cnt2; ++i) putchar('2'), putchar(' ');
for(int i = 2; i <= cnt1; ++i) putchar('1'), putchar(' ');
return 0;
}
D
动态规划
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#include <set>
#define id(x) (x - 'a')
using namespace std;
const int N = 1e5 + 5;
const int M = 255;
const int Sig = 55;
const int inf = 0x3f3f3f3f;
int n, m;
char str[N];
int p[N][Sig], pre[Sig];
int f[M][M][M];
int ss[3][M], top[3];
inline void ins(int type){
int ii, jj, kk; ii = jj = kk = 0;
if(type == 0) ii = top[0];
else if(type == 1) jj = top[1];
else kk = top[2];
for(int i = ii; i <= top[0]; ++i){
for(int j = jj; j <= top[1]; ++j){
for(int k = kk; k <= top[2]; ++k){
if(i && f[i - 1][j][k] < inf) f[i][j][k] = min(f[i][j][k], p[f[i - 1][j][k]][ss[0][i]]);
if(j && f[i][j - 1][k] < inf) f[i][j][k] = min(f[i][j][k], p[f[i][j - 1][k]][ss[1][j]]);
if(k && f[i][j][k - 1] < inf) f[i][j][k] = min(f[i][j][k], p[f[i][j][k - 1]][ss[2][k]]);
//printf("%d %d %d %d\n", i, j, k, f[i][j][k]);
}
}
}
}
inline void del(int type){
int ii, jj, kk; ii = jj = kk = 0;
if(type == 0) ii = top[0];
else if(type == 1) jj = top[1];
else kk = top[2];
for(int i = ii; i <= top[0]; ++i)
for(int j = jj; j <= top[1]; ++j)
for(int k = kk; k <= top[2]; ++k)
f[i][j][k] = inf;
}
int main(){
scanf("%d%d%s", &n, &m, str + 1);
for(int i = 0; i < Sig; ++i) pre[i] = inf;
for(int i = n; i >= 1; --i){
for(int j = 0; j < Sig; ++j) p[i][j] = pre[j];
pre[id(str[i])] = i;
}
for(int j = 0; j < Sig; ++j) p[0][j] = pre[j];
memset(f, 0x3f, sizeof(f)); f[0][0][0] = 0;
char opt[5], rd[5]; int x, y;
while(m--){
scanf("%s%d", opt, &x); --x;
if(opt[0] == '+'){
scanf("%s", rd); y = id(rd[0]);
ss[x][++top[x]] = y;
ins(x);
}
else {
del(x);
--top[x];
}
//printf("%d %d %d %d\n", top[0], top[1], top[2], f[top[0]][top[1]][top[2]]);
if(f[top[0]][top[1]][top[2]] <= n) printf("YES\n");
else printf("NO\n");
}
return 0;
}
E
(题目链接)[http://codeforces.com/contest/1150/problem/E]
跪求这道题!!!qvq有会的大佬麻烦救救孩子!!!
感恩戴德!
qq3338315493