链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
北极探险队有新收获了!!!
北极探险队发现了NNN条长度不一的冰柱,由于冰柱里封存有价值的生物,现在需要两名生物学家小A和小B对冰柱进行分析,公平起见,探险队将每条冰柱都均分成长度为1的冰块,现在规定两位生物学家开始轮流选择冰块,小A先选,每次选择小A只能在任意一条没被选空的冰柱的最左边选择一个长度为1的冰块,而小B只能在任意一条没被选空的冰柱的最右边选择一个长度为1的冰块;
依据题意,上述这条冰柱,小A会选择左边四个冰块 价值为33+17+2+6=58,33 + 17 + 2 + 6 = 58,33+17+2+6=58, 同理小B选择右边三个的价值为11+18+19=48.11 + 18 + 19 = 48.11+18+19=48.
问:若两位生物学家都采用最优策略,那么 小A 和 小B 的能选到的冰块价值最后分别是多少?
输入描述:
第一行输入一个n(1≤n≤105)n(1 \leq n \leq 10^5)n(1≤n≤105), 表示冰柱数量。
接下来nnn行,
每行第一个数字x(0≤x≤105)x (0 \leq x \leq 10^5)x(0≤x≤105),表示将冰柱分成xxx个冰块,紧接着输入xxx个数字aia_iai,每个ai(1≤ai≤109)a_i(1 \leq a_i \leq 10^9)ai(1≤ai≤109)表示每个冰块的价值。
数据保证xxx之和不超过2×105;2 × 10^5;2×105;
输出描述:
分别输出 小A的分数 和 小B的分数。
示例1
输入
复制1 7 33 17 2 6 11 18 19
1 7 33 17 2 6 11 18 19
输出
复制58 48
58 48
示例2
输入
复制3 4 15 18 17 16 2 1 3 1 20
3 4 15 18 17 16 2 1 3 1 20
输出
复制54 36
54 36
做法
如果是奇数,就两人分别取左右两边,最后剩一个数存起来;如果是偶数,就直接两人取左右两边。最后存起来的那些数,两人都取剩下中最大的。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n,x,a[N];
int ans1,ans2;
signed main(){
cin.tie(0);
ios::sync_with_stdio(0);
cin>>n;
vector<int> v;
for(int i=1;i<=n;i++){
int x;
cin>>x;
vector<int> g(x+1);
for(int j=1;j<=x;j++){
cin>>g[j];
}
if(x%2){
for(int j=1;j<=x/2;j++){
ans1+=g[j];
}
v.push_back(g[x/2+1]);
for(int j=x/2+2;j<=x;j++){
ans2+=g[j];
}
}
else{
for(int j=1;j<=x/2;j++){
ans1+=g[j];
}
for(int j=x/2+1;j<=x;j++){
ans2+=g[j];
}
}
}
sort(v.begin(),v.end());
int cnt=0;
for(int i=v.size()-1;i>=0;i--){
if(cnt%2==0) ans1+=v[i];
else ans2+=v[i];
cnt++;
}
cout<<ans1<<" "<<ans2;
}