My T-shirt suits me
My T-shirt suits me |
Our friend Victor participates as an instructor in an environmental volunteer program. His boss asked Victor to distribute N T-shirts to M volunteers, one T-shirt each volunteer, where N is multiple of six, and NM. There are the same number of T-shirts of each one of the six available sizes: XXL, XL, L, M , S, and XS. Victor has a little problem because only two sizes of the T-shirts suit each volunteer.
You must write a program to decide if Victor can distribute T-shirts in such a way that all volunteers get a T-shirt that suit them. If N M, there can be some remaining T-shirts.
Input
The first line of the input contains the number of test cases. For each test case, there is a line with two numbers N and M. N is multiple of 6, 1N36, and indicates the number of T-shirts. Number M, 1M30, indicates the number of volunteers, with NM. Subsequently, M lines are listed where each line contains, separated by one space, the two sizes that suit each volunteer (XXL, XL, L, M , S, or XS).
Output
For each test case you are to print a line containing YES if there is, at least, one distribution where T-shirts suit all volunteers, or NO, in other case.
Sample Input
3 18 6 L XL XL L XXL XL S XS M S M L 6 4 S XL L S L XL L XL 6 1 L M
Sample Output
YES NO YES
题意:有6种size的T-shirt,每种n / 6件,有m个人,每人有两种size可以穿,问能否所有人都穿到T-shirt
思路:写了两种,一种暴力,一种最大流
代码:
暴力枚举
#include <stdio.h>
#include <string.h>
const int M = 35;
const char size[6][10] = {"XS", "S", "M", "L", "XL", "XXL"};
int T, n, m, s[M][2], have[6];
char a[10], b[10];
int find(char *a) {
for (int i = 0; i < 6; i ++)
if (strcmp(size[i], a) == 0)
return i;
}
void init() {
scanf("%d%d", &n, &m);
for (int i = 0; i < 6; i ++)
have[i] = n / 6;
for (int i = 0; i < m; i ++) {
scanf("%s%s", a, b);
s[i][0] = find(a);
s[i][1] = find(b);
}
}
bool dfs(int start) {
if (start == m)
return true;
for (int i = 0; i < 2; i ++) {
if (have[s[start][i]]) {
have[s[start][i]] --;
if (dfs(start + 1)) return true;
have[s[start][i]] ++;
}
}
return false;
}
void solve() {
init();
if (dfs(0)) printf("YES\n");
else printf("NO\n");
}
int main() {
scanf("%d", &T);
while (T --) {
solve();
}
return 0;
}
最大流
#include <stdio.h>
#include <string.h>
#define INF 0x3f3f3f3f
#include <queue>
using namespace std;
const char size[6][10] = {"XS", "S", "M", "L", "XL", "XXL"};
int T, n, m, g[50][50], f[50][50], p[50], a[50];
char str1[10], str2[10];
queue<int>q;
int find(char *a) {
for (int i = 0; i < 6; i ++) {
if (strcmp(a, size[i]) == 0)
return i;
}
}
void init() {
scanf("%d%d", &n, &m);
memset(g, 0, sizeof(g));
for (int i = m + 1; i <= m + 6; i ++)
g[0][i] = n / 6;
for (int i = 1; i <= m; i ++) {
scanf("%s%s", str1, str2);
g[find(str1) + m + 1][i] = 1;
g[find(str2) + m + 1][i] = 1;
g[i][m + 7] = 1;
}
}
void solve() {
init();
int ans = 0, s = 0, t = m + 7;
memset(f, 0, sizeof(f));
while (1) {
memset(a, 0, sizeof(a));
a[s] = INF;
q.push(s);
while (!q.empty()) {
int u = q.front(); q.pop();
for (int v = 1; v <= t; v ++) {
if (!a[v] && g[u][v] - f[u][v] > 0) {
a[v] = min(a[u], g[u][v] - f[u][v]);
q.push(v); p[v] = u;
}
}
}
if (a[t] == 0) break;
for (int u = t; u != s; u = p[u]) {
f[p[u]][u] += a[t];
f[u][p[u]] -= a[t];
}
ans += a[t];
}
if (ans < m) printf("NO\n");
else printf("YES\n");
}
int main() {
scanf("%d", &T);
while (T --) {
solve();
}
return 0;
}