window.cnblogsConfig = {//可以放多张照片,应该是在每一个博文上面的图片,如果是多张的话,那么就随机换的。 homeTopImg: [ "https://i.loli.net/2019/08/02/5d440029af8e994539.png" ], }

UVA11218的题解

题目翻译大意

有九个人要去 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;
}
posted @ 2024-01-21 21:51  mgcjade  阅读(11)  评论(0)    收藏  举报