提供AC代码者悬赏关注~

题目总版

zhege122 @ 2024-11-16 12:27:26

题目描述

西行寺幽幽子的庭院中有n棵樱花树,每棵樱花树都有一个美丽值a_i

幽幽子决定将这些树分成不超过m组,每组树的美丽度为组内所有美丽度不同的树的美丽度之和(比如1,1,1,2,2,2这组的美丽度为1+2=3

求最优分组方案下,所有组的美丽度总和。

输入

第一行输入两个整数n, m, 表示樱花树数量和最大分组数量。

接下来一行输入n个整数,表示每棵树的美丽度a_i

输出

输出仅一个整数,表示最大的美丽度总和。

样例

输入数据 1

12 2
1 2 3 4 2 3 4 5 3 4 5 6

输出数据 1

35

数据规模

对于前 30% 的数据:1 \le n,m,a_i \le 100

对于前 50% 的数据:1 \le n \le 10^4

对于前 70% 的数据:1 \le a_i \le 10^6

对于另外 10% 的数据:m=n

对于 100% 的数据:1 \le n,m \le 10^6,1 \le a_i \le 10^9

样例解释

最优分组方案之一为1,2,3,4,3,52,4,3,4,5,6,美丽度总和为(1+2+3+4+5)+(2+3+4+5+6)=35

MY CODE

#include <bits/stdc++.h>

using namespace std;

int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    vector<int> beauty(n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &beauty[i]);
    }
    long long tot = 0;
    if (m > 1) {
        for (int b : beauty) {
            tot += b;
        }
        printf("%lld\n", tot);
    } else {
        for (int b : beauty) {
            tot += b;
        }
        printf("%lld\n", tot);
    }

    return 0;
}

请大佬们帮忙调试一下,连结果都不对,提供AC代码者必关!!! 在线等,很急!!!


by r2bxyy @ 2024-11-16 12:35:07

对于每个组,最优解一定是每个组内每种树只有一颗

#include<bits/stdc++.h>
#define N 200009
//N根据题目要求修改 
using namespace std;
map<int,int> cnt,vst;
int a[N],ans;
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        cnt[a[i]]++;
    }
    for(int i=1;i<=n;i++){
        if(vst[a[i]]==1)continue;//这种树已经计算过了
        ans+=min(m,cnt[a[i]])*a[i];//如果有m颗那就每组放一个,没有就能放多少放多少
        vst[a[i]]=1;
    }
    cout<<ans<<endl;
    return 0;
}

by zhege122 @ 2024-11-16 12:38:58

@r2bxyy 好的,我试一下


by zhege122 @ 2024-11-16 12:41:50

@r2bxyyRE 了5个点,还能再调调吗?


by r2bxyy @ 2024-11-16 12:51:35

@zhege122去吃了个饭 数据范围发一下?


by _Kenma_ @ 2024-11-16 12:52:12

把 N 改成 10^6


by r2bxyy @ 2024-11-16 12:53:00

不好意思,没展开 改成10^6就好了@zhege122


by zhege122 @ 2024-11-16 12:56:45

@r2bxyy 好,非常感谢,已关!


by zhege122 @ 2024-11-16 12:56:57

@Kenma 已关


|