RCC 2014 Warmup (Div. 2)
2014-04-18 20:49
393 查看
A题:看是全用c好还是全用d好还是都用的问题最少,注意 n * m <= k的时候特判
B题:题意坑死了,就开一个vis数组记录每个人前面的提交数,如果矛盾就false
C题:构造,只要判断n - k 是否 <= k,输出就按当前一个和后面k个连即可
D题:状压DP,按k排序,然后dp数组只要记录完成集合,利用滚动数组优化空间,然后每次加上k * d去取最小值即可
E题:构造问题,不过用随机算法貌似更简便。构造出来的矩阵应该是
a a a a a b
a a a a a b
a a a a a b
c c c c c d
这样的,然后只要去随机a, b, c, d判断每行每列和是不是完全平方数即可
代码:
A:
#include <stdio.h>
#include <string.h>
#include <math.h>2
#define min(a,b) ((a)<(b)?(a):(b))
int c, d, n, m, k;
int main() {
scanf("%d%d%d%d%d", &c, &d, &n, &m, &k);
int sb = n * m - k;
if (sb <= 0) printf("0\n");
else printf("%d\n", min(sb * d, min((int)ceil(sb * 1.0 / n) * c, sb / n * c + sb % n * d)));
return 0;
}
B:
#include <stdio.h>
#include <string.h>
const int N = 100005;
int n, vis
;
struct Solu {
int x, k;
} s
;
bool judge() {
memset(vis, 0, sizeof(vis));
for (int i = 0; i < n; i++) {
int x = s[i].x, k = s[i].k;
if (x == vis[k])
vis[k]++;
else if (x > vis[k])
return false;
}
return true;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d%d", &s[i].x, &s[i].k);
if (judge()) printf("YES\n");
else printf("NO\n");
return 0;
}
C:
#include <stdio.h>
#include <string.h>
int n, k;
int main() {
scanf("%d%d", &n, &k);
if ((n - k) <= k) printf("-1\n");
else {
printf("%d\n", n * k);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= k; j++) {
int a = i, b = i + j;
if (b > n) b -= n;
printf("%d %d\n", a, b);
}
}
}
return 0;
}
D:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
__int64 one = 1;
const int N = 105;
const int M = (1<<20) + 5;
const __int64 INF = (one<<62);
__int64 b, dp[M];
int i, j, n, m;
struct F {
__int64 x, k, s;
} f
;
bool cmp(F a, F b) {
return a.k < b.k;
}
int main() {
__int64 ans = INF;
scanf("%d%d%I64d", &n, &m, &b);
for (i = 1; i <= n; i++) {
int num, ss;
scanf("%I64d%I64d%d", &f[i].x, &f[i].k, &num);
while (num--) {
scanf("%d", &ss);
f[i].s |= (1<<(ss-1));
}
}
int smax = (1<<m);
sort(f + 1, f + n + 1, cmp);
for (i = 1; i < smax; i++)
dp[i] = INF;
for (i = 1; i <= n; i++) {
for (j = 0; j < smax; j++) {
int ss = (j|f[i].s);
dp[ss] = min(dp[ss], dp[j] + f[i].x);
}
ans = min(ans, dp[smax - 1] + f[i].k * b);
}
if (ans == INF) ans = -1;
printf("%I64d\n", ans);
return 0;
}
E:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
int n, m;
bool check(int num) {
int m = (int)sqrt(num);
return m * m == num;
}
int main() {
scanf("%d%d", &n, &m);
int a, b, c, d, i, j;
while (1) {
a = rand() % 100 + 1;
b = rand() % 100 + 1;
c = rand() % 100 + 1;
d = rand() % 100 + 1;
if (check((m - 1) * a * a + b * b) &&
check((m - 1) * c * c + d * d) &&
check((n - 1) * a * a + c * c) &&
check((n - 1) * b * b + d * d))
break;
}
for (i = 0; i < n - 1; i++) {
for (j = 0; j < m - 1; j++)
printf("%d ", a);
printf("%d\n", b);
}
for (j = 0; j < m - 1; j++)
printf("%d ", c);
printf("%d\n", d);
return 0;
}
B题:题意坑死了,就开一个vis数组记录每个人前面的提交数,如果矛盾就false
C题:构造,只要判断n - k 是否 <= k,输出就按当前一个和后面k个连即可
D题:状压DP,按k排序,然后dp数组只要记录完成集合,利用滚动数组优化空间,然后每次加上k * d去取最小值即可
E题:构造问题,不过用随机算法貌似更简便。构造出来的矩阵应该是
a a a a a b
a a a a a b
a a a a a b
c c c c c d
这样的,然后只要去随机a, b, c, d判断每行每列和是不是完全平方数即可
代码:
A:
#include <stdio.h>
#include <string.h>
#include <math.h>2
#define min(a,b) ((a)<(b)?(a):(b))
int c, d, n, m, k;
int main() {
scanf("%d%d%d%d%d", &c, &d, &n, &m, &k);
int sb = n * m - k;
if (sb <= 0) printf("0\n");
else printf("%d\n", min(sb * d, min((int)ceil(sb * 1.0 / n) * c, sb / n * c + sb % n * d)));
return 0;
}
B:
#include <stdio.h>
#include <string.h>
const int N = 100005;
int n, vis
;
struct Solu {
int x, k;
} s
;
bool judge() {
memset(vis, 0, sizeof(vis));
for (int i = 0; i < n; i++) {
int x = s[i].x, k = s[i].k;
if (x == vis[k])
vis[k]++;
else if (x > vis[k])
return false;
}
return true;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d%d", &s[i].x, &s[i].k);
if (judge()) printf("YES\n");
else printf("NO\n");
return 0;
}
C:
#include <stdio.h>
#include <string.h>
int n, k;
int main() {
scanf("%d%d", &n, &k);
if ((n - k) <= k) printf("-1\n");
else {
printf("%d\n", n * k);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= k; j++) {
int a = i, b = i + j;
if (b > n) b -= n;
printf("%d %d\n", a, b);
}
}
}
return 0;
}
D:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
__int64 one = 1;
const int N = 105;
const int M = (1<<20) + 5;
const __int64 INF = (one<<62);
__int64 b, dp[M];
int i, j, n, m;
struct F {
__int64 x, k, s;
} f
;
bool cmp(F a, F b) {
return a.k < b.k;
}
int main() {
__int64 ans = INF;
scanf("%d%d%I64d", &n, &m, &b);
for (i = 1; i <= n; i++) {
int num, ss;
scanf("%I64d%I64d%d", &f[i].x, &f[i].k, &num);
while (num--) {
scanf("%d", &ss);
f[i].s |= (1<<(ss-1));
}
}
int smax = (1<<m);
sort(f + 1, f + n + 1, cmp);
for (i = 1; i < smax; i++)
dp[i] = INF;
for (i = 1; i <= n; i++) {
for (j = 0; j < smax; j++) {
int ss = (j|f[i].s);
dp[ss] = min(dp[ss], dp[j] + f[i].x);
}
ans = min(ans, dp[smax - 1] + f[i].k * b);
}
if (ans == INF) ans = -1;
printf("%I64d\n", ans);
return 0;
}
E:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
int n, m;
bool check(int num) {
int m = (int)sqrt(num);
return m * m == num;
}
int main() {
scanf("%d%d", &n, &m);
int a, b, c, d, i, j;
while (1) {
a = rand() % 100 + 1;
b = rand() % 100 + 1;
c = rand() % 100 + 1;
d = rand() % 100 + 1;
if (check((m - 1) * a * a + b * b) &&
check((m - 1) * c * c + d * d) &&
check((n - 1) * a * a + c * c) &&
check((n - 1) * b * b + d * d))
break;
}
for (i = 0; i < n - 1; i++) {
for (j = 0; j < m - 1; j++)
printf("%d ", a);
printf("%d\n", b);
}
for (j = 0; j < m - 1; j++)
printf("%d ", c);
printf("%d\n", d);
return 0;
}
相关文章推荐
- RCC 2014 Warmup (Div. 2)__Elimination
- RCC 2014 Warmup (Div. 2) D. Cunning Gena
- RCC 2014 Warmup (Div. 2) A~C
- RCC 2014 Warmup (Div. 2) 解题报告
- RCC 2014 Warmup (Div. 2)__Cunning Gena
- RCC 2014 Warmup (Div. 1)
- RCC 2014 Warmup (Div. 2)
- 【索引】Codeforces RCC 2014 Warmup (Div. 2)
- RCC 2014 Warmup (Div. 2) D. Cunning Gena(状压DP)
- RCC 2014 Warmup (Div. 2)
- RCC 2014 Warmup (Div. 2) A~C
- CodeForces 417C(RCC 2014 Warmup (Div. 2) C)(构造)
- RCC 2014 Warmup (Div. 2)
- CF RCC 2014 Warmup (Div. 2) D. Cunning Gena
- RCC 2014 Warmup (Div. 2) 蛋疼解题总结
- CF RCC 2014 Warmup (Div. 2) D. Cunning Gena
- RCC 2014 Warmup (Div. 2) ABC
- 【jzoj3824】【codeforces RCC 2014 Warmup (Div. 1) D】【Big Problems for Organizers】【树】
- Codeforces Rcc 2014 warmup (div.2)
- cf RCC 2014 Warmup (D题 关于搜索和dp的选择的理解)