问题标题: 酷町堂:2609

0
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个样例,就应该没问题。加油,试一试!

首次回帖,望采纳

我要回答