Sicily - 17958 - Algorithm Lectures 【找规律】

Ante和Goran为大学生编程竞赛准备讲座,需合理安排时间,确保每队学生都能高效理解算法,通过策略减少冲突,优化教学流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Algorithm Lectures
Time Limit: 1 secs, Memory Limit: 256 MB
Description

Ante and Goran are preparing N teams of young ambitious students for a student programming competition of students from University of Zagreb. Both of them have one algorithm they have to explain to each team. Of course, both can’t work with the same team at the same time and none of them can work with multiple teams simultaneously.

You are given the time it takes for each team to understand and implement an algorithm. Each algorithm lecture has to be done without interruption. Determine the minimal time required for Ante and Goran to do their lectures!

For additional explanation, consult the sample tests clarifications.

Input

The first line of input contains the integer N, the number of teams.

The following line contains N space separated integers, where the ith integer denotes the time required for the ith team to understand and implement an algorithm.

All numbers in the input will belong to the interval [1, 3 * 105].

Output

The first and only line of output must contain the required number from the task.

Sample Input
样例一:
3
2 2 2
样例二:
3
4 1 2
样例三:
4
1 3 2 1
Sample Output
样例一:
6
样例二:
8
样例三:
7
Hint

Clarification of the first example: Each team needs 2 units of time to understand and implement an algorithm. One of the possible schedules is that Ante gives his lectures to team 1, team 2 and team 3, respectively, and Goran to team 3, team 1 and team 2, respectively.

Clarification of the second example: One of the optimal schedules is that Ante gives lectures to team 2, team 3 and team 1, respectively, but with a pause lasting 1 unit of time between team 3 and team 1. Goran will give lectures to team 1, team 3 and team 2, respectively.

 

  分析:为了尽量分开教学、减少冲突,我们可以先将序列降序排序,然后Ante老师从左到右上课,Goran老师从时间第二长的课开始从左到右上课,最后一节课上时间最长的课。我们会发现如下规律:

  

#include <cstdio>
#include <iostream>

using namespace std;


int main ()
{
    int n, x, maxn = -1;
    long long sum = 0, ans;
    scanf("%d", &n);
    for(int i=0; i<n; i++){
        scanf("%d", &x);
        sum += x;
        if(maxn < x) {
            maxn = x;
        }
    }
    if(maxn <= sum - maxn)    ans = sum;
    else    ans = 2*maxn;
    printf("%lld\n", ans);
    
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值