在一个包括你自己(成员 1)有 n 个成员的辩论俱乐部中,有 k 个议题需要按顺序讨论。 在每次讨论中,成员都会表达他们同意或不同意的观点。 我们将 Y 定义为同意的成员数量,N 为不同意的成员数量。 每次讨论后,会员根据以下标准离开俱乐部: ·如果同意的成员多于不同意的成员(Y>N),则所有不同意的成员都会离开俱乐部。 ·如果不同意的成员多于同意的成员(Y<N),则所有同意的成员都会离开俱乐部。 ·如果平局(Y=N),则所有会员均离开俱乐部。 作为俱乐部主席,您的目标是留在俱乐部并最大程度地使得会议后剩余的会员数量更多。 在会议开始之前,您可以了解每个成员对所有 k 个意见的立场,并且你可以在所有会议开始之前就驱逐任意数量的成员(不包括你自己)。

【输入格式】 第一行包含两个正整数n和k分别表示成员数量和讨论数量。 接下来 n 行中,第 i 行包含一个长度为 k 的字符串 ti。 字符串 ti 中的第 j 个字符表示第 i 个成员同意或不同意第 j 个意见(如果他们没有在会议开始之前就离开俱乐部的话),“+”号表示同意,“-”号表示不同意。

【输出格式】 一行一个整数,表示所有会议结束后,包括你自己在内可以留在俱乐部的最大会员人数。

【输入样例1】 2 2 ++ +-

【输出样例1】 1

【输入样例2】 1 3 +-+

【输出样例2】 1

【输入样例3】 4 1 +

【输出样例3】 2

【输入样例4】 5 4 ++++ +--+ ++-+ +-++ ++++

【输出样例4】 2

【输入样例5】 4 2 ++

-- -+

【输出样例5】 1

【样例解释】 对于样例1,只有第一位成员可以参加会议,否则在讨论第二个议题后,两位成员都会离开。 对于样例2,只有一名成员出席会议并坚持到最后。 对于样例3,俱乐部有4名成员,会议期间只会讨论一项议题。 让我们根据会议参与者来分析可能的结果: 如果只有第一位成员出席,那么他将是会议结束后剩下的唯一成员。 如果第一个成员与第二个或第三个成员一起参加,他们将在议题中打成平局,导致他们都离开。 如果第一名成员与第二名和第三名成员一起出席,则第一名成员将成为少数派,并在讨论后离开,这与声明相矛盾。 如果第一名和第四名成员出席,他们将在讨论过程中达成一致,并保留到最后。 如果第一、第二、第四名成员参加,则讨论时第二名成员将成为少数,最后只剩下第一、第四名成员。 如果第二个成员被第三个成员替换,也会发生同样的情况。 如果四位成员都参加,讨论过程中就会出现平局,导致所有人离开。 会议结束后剩余成员最多为2人。 对于样例4,俱乐部现有会员5名,会议将讨论4项议题。 实现最大成员人数的一种方法是只有第一、第三和第五名成员参加会议。 在这种情况下,他们在前两次讨论中都同意,之后在第三次讨论中第三个成员处于少数。 然后,第一名和第五名成员在最后一次讨论中达成一致,这两名成员留到会议结束。 对于样例5,俱乐部有4名成员,将讨论2条议题。 如果前三名成员出席会议,则第一位成员将在第一次讨论中成为少数派,并将离开俱乐部。 之后,第二名和第三名成员均不同意第二个意见,并留至会议结束。 这样,会议结束后就会剩下2名成员,但这是一个无效的结果,因为它迫使第一个成员离开。 因此,只能只有第一位成员出席会议,此时,达到 1 名成员的最大人数。

【数据范围及约定】 对于100%的数据,1≤n,k≤100

请重新理解题干内容:该问题可以通过贪心算法求解。

首先,我们需要遍历每个议题,统计同意和不同意的人数。

然后,我们可以根据同意和不同意的人数来判断该议题的结果:

  1. 如果同意的人数多于不同意的人数,则所有不同意的人都会离开。
  2. 如果不同意的人数多于同意的人数,则所有同意的人都会离开。
  3. 如果同意的人数等于不同意的人数,则所有人都会离开。

接下来,我们需要判断在每个议题之后,剩下的人数是否大于之前的最大人数,如果是,则更新最大人数。

最后,输出最大人数即为解。

算法的时间复杂度为O(n*k),其中n为成员数量,k为议题数量。

具体实现代码如下:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main() {
    int n, k;
    cin >> n >> k;
    
    vector<string> opinions(n);
    for (int i = 0; i < n; i++) {
        cin >> opinions[i];
    }
    
    int maxMembers = 0;
    for (int i = 0; i < k; i++) {
        int agree = 0;
        int disagree = 0;
        
        for (int j = 0; j < n; j++) {
            if (opinions[j][i] == '+') {
                agree++;
            } else {
                disagree++;
            }
        }
        
        if (agree > disagree) {
            maxMembers += disagree;
        } else if (disagree > agree) {
            maxMembers += agree;
        } else {
            maxMembers += agree + disagree;
        }
    }
    
    cout << maxMembers + 1 << endl;
    
    return 0;
}

时间复杂度:O(n*k) 空间复杂度:O(n)


原文地址: https://www.cveoy.top/t/topic/qnJi 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录