0
陆楚岳
中级守护
中级守护
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<sstream>
using namespace std;
int n,cnt,a[1000010],maxn;
struct nn{
long long x,m;
}s[100010];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>s[i].x>>s[i].m;
for(int j=1;j<=s[i].x;j++){
a[++cnt]=s[i].m;
}
}
sort(a+1,a+cnt+1);
long long i=1,j=cnt;
while(i<=j){
maxn=max(maxn,a[i]+a[j]);
i++,j--;
}
cout<<maxn;
return 0;
}
怎么改
样例:
20
46930887 804289384
14636916 681692778
24238336 957747794
49760493 719885387
39641422 596516650
490028 25202363
2520060 783368691
17513927 44897764
40383427 365180541
3455737 304089173
21595369 35005212
26956430 294702568
11021531 336465783
33665124 278722863
18703136 145174068
1979803 101513930
35723059 315634023
25898168 369133070
39018457 59961394
6478044 628175012
1002645558
(RT,10分)
1
0
0
0
阚睿扬
新手守护
新手守护
这道题有几个难点:
①你的cnt最大为10^9,sort排序时间复杂度为nlogn,会超时,所以不需要定义a数组(就算要定义,大小也是1000000010),应该直接对结构体进行排序(要写一个cmp);
②后面的双向指针写的没问题,指向a数组改成指向结构体即可,但是注意要剪枝优化——对于当前的i和j,ans与a[i].sum+a[i].sum比完大小后,因为不止一个a[i].sum和a[j].sum,所以要用一个while循环去重(这是关键)。
按照思路写可以AC,对于样例,只要能过题目给的,和你查看数据后的2个样例,就应该没问题。加油,试一试!
首次回帖,望采纳