题目描述
小 L 是学校算法协会的成员。在今年的学校社团招新中,小 L 一共招收了 n 个新成员,其中 n 为偶数。现在小 L 希望将他们分到协会不同的部门。
算法协会共设有三个部门,其中第 i (1≤i≤n) 个新成员对第 j (1≤j≤3) 个部门的满意度为 a
i,j
。定义一个分配方案的满意度为所有新成员对分配到的部门的满意度之和,也就是说,若将第 i (1≤i≤n) 个新成员分配到了第 d
i
∈{1,2,3} 个部门,则该分配方案的满意度为 ∑
i=1
n
a
i,d
i
。
小 L 不希望某一个部门的新成员数量过多。具体地,他要求在分配方案中,不存在一个部门被分配多于
2
n
个新成员。你需要帮助小 L 求出,满足他要求的分配方案的满意度的最大值。
输入格式
本题包含多组测试数据。
输入的第一行包含一个正整数 t,表示测试数据组数。
接下来依次输入每组测试数据,对于每组测试数据:
第一行包含一个正整数 n,表示新成员的数量。
第 i+1 (1≤i≤n) 行包含三个非负整数 a
i,1
,a
i,2
,a
i,3
,分别表示第 i 个新成员对第 1,2,3 个部门的满意度。
输出格式
对于每组测试数据,输出一行一个非负整数,表示满足小 L 要求的分配方案的满意度的最大值。
输入输出样例
输入 #1复制
3
4
4 2 1
3 2 4
5 3 4
3 5 1
4
0 1 0
0 1 0
0 2 0
0 2 0
2
10 9 8
4 0 0
输出 #1复制
18
4
13
说明/提示
【样例 1 解释】
该样例共包含三组测试数据。
对于第一组测试数据,可以将四个新成员分别分配到第 1,3,1,2 个部门,则三个部门的新成员数量分别为 2,1,1,均不超过
2
4
=2,满意度为 4+4+5+5=18。
对于第二组测试数据,可以将四个新成员分别分配到第 1,1,2,2 个部门,则三个部门的新成员数量分别为 2,2,0,均不超过
2
4
=2,满意度为 0+0+2+2=4。
对于第三组测试数据,可以将两个新成员分别分配到第 2,1 个部门,则三个部门的新成员数量分别为 1,1,0,均不超过
2
2
=1,满意度为 9+4=13。
【样例 2】
见选手目录下的 club/club2.in 与 club/club2.ans。
该样例满足测试点 3,4 的约束条件。
【样例 3】
见选手目录下的 club/club3.in 与 club/club3.ans。
该样例满足测试点 5∼8 的约束条件。
【样例 4】
见选手目录下的 club/club4.in 与 club/club4.ans。
该样例满足测试点 9 的约束条件。
【样例 5】
见选手目录下的 club/club5.in 与 club/club5.ans。
该样例满足测试点 15,16 的约束条件。
【数据范围】
对于所有测试数据,保证:
1≤t≤5;
2≤n≤10
5
,且 n 为偶数;
对于所有 1≤i≤n,1≤j≤3,均有 0≤a
i,j
≤2×10
4
。
AC代码:#include <bits/stdc++.h>
#define FstIO ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define pii pair<ll, ll>
using namespace std;
using ll = long long;
const ll N = 3e5 + 2, M = 1e2 + 5;
const ld eps = 1e-6;
ll T, n;
priority_queue <ll> p, q, k;
ll mymax(ll x, ll y, ll z) { return max(max(x, y), z); }
signed main()
{
freopen("club.in", "r", stdin);
freopen("club.out", "w", stdout);
FstIO;
cin >> T;
while (T -- )
{
cin >> n;
ll c1 = 0, c2 = 0, c3 = 0, s = 0;
for (ll i = 1; i <= n; ++ i )
{
ll x, y, z; cin >> x >> y >> z;
if (mymax(x, y, z) == x) s += x, ++ c1, p.push(max(y - x, z - x));
else if (mymax(x, y, z) == y) s += y, ++ c2, q.push(max(z - y, x - y));
else s += z, ++ c3, k.push(max(x - z, y - z));
}
while (c1 > n / 2)
{
-- c1;
s += p.top(); p.pop();
}
while (c2 > n / 2)
{
-- c2;
s += q.top(); q.pop();
}
while (c3 > n / 2)
{
-- c3;
s += k.top(); k.pop();
}
cout << s << '\n';
while (!p.empty()) p.pop();
while (!q.empty()) q.pop();
while (!k.empty()) k.pop();
}
return 0;
}
我的代码:#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int T,n,cnt[3],ans;
struct node{
int val[3],d,maxid,secid;
}a[N];
bool cmp(node a,node b){
return a.d>b.d;
}
void doit(){
memset(cnt,0,sizeof(cnt));
ans=0;
memset(a,0,sizeof(a));
cin>>n;
for(int i=1;i<=n;i++){
int maxn=0,maxsec=0,maxid=0,secid=0;
for(int j=0;j<3;j++){
cin>>a[i].val[j];
if(a[i].val[j]>=maxn)maxsec=maxn,maxn=a[i].val[j],secid=maxid,maxid=j;
else if(a[i].val[j]>maxsec)maxsec=a[i].val[j],secid=j;
}
a[i].d=maxn-maxsec;
a[i].maxid=maxid;
a[i].secid=secid;
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++){
if(cnt[a[i].maxid]<n/2){
ans+=a[i].val[a[i].maxid];
cnt[a[i].maxid]++;
}
else ans+=a[i].val[a[i].secid];
}
cout<<ans<<endl;
}
int main(){
freopen("club.in","r",stdin);
freopen("club.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>T;
while(T--)doit();
return 0;
}
请分析我的代码哪里有错误