题目翻译大意
有九个人要去 KTV 唱歌,每三个人为一组分成三组,现在给出了 \(n\) 种分的组合,输入四个数 \(a,b,c,s\) 分别代表 \(a,b,c\) 这三个人的构成一个组合能获得 \(s\) 分,现在要求最多能获得多少得分。如果无法把分配九个人就输出 -1
。
-
分析数据范围:
看这数据,\(n < 81\) 不就是明显摆着让我们暴搜的吗?
-
做题思路:
考虑暴力。由于需要分成三组,可以直接枚举三个组,随后判断是否成立,若成立,求最大值。
-
代码:
#include <bits/stdc++.h>
using namespace std;
int n;
int a[81][4];
int ans;
int vis[10];
int check(int x, int y, int z)
{
memset(vis, 0, sizeof(vis));
int ret = a[x][3] + a[y][3] + a[z][3];
for (int i = 0; i < 3; i++)
vis[a[x][i]]++, vis[a[y][i]]++, vis[a[z][i]]++;
for (int i = 1; i <= 9; i++)
if (vis[i] > 1)
return -1;
return ret;
}
int main()
{
int cnt = 0;
while (1)
{
cnt++;
cin >> n;
ans = -1;
if (n == 0)
break;
for (int i = 0; i < n; i++)
for (int j = 0; j < 4; j++)
cin >> a[i][j];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
for (int k = 0; k < n; k++)
ans = max(ans, check(i, j, k));
printf("Case %d: %d\n", cnt, ans);
}
return 0;
}
标签:cnt,return,int,题解,UVA11218,++,vis,ans
From: https://www.cnblogs.com/mgcjade/p/17978470