牛客小白月赛4——A 三角形

链接:https://ac.nowcoder.com/acm/contest/134/A
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

铁子从森林里收集了n根木棍,她开始将它们按顺序的排成一排,从左到右依次为1到n,她回想起
在数学课上老师教她的三角形知识,她开始从这些木棍中间找三根木棍来组成一个周长最大的三角形,
这时她的兄弟顺溜偷偷的溜了过来,偷走了第i根木棍,现在她想知道现在能够组成周长最大的三角形
的周长是多少?

输入描述:

第一行两个整数n和q。(1 ≤ n, q ≤ 10^5)
第二行n个整数表示第i根木棍的长度ai。(1 ≤ ai ≤ 10^9)
接下来q行,每行一个整数表示被顺溜偷走的木棍编号。注意每行的事件是独立的,也就是说每一次操作都是对于原来的n根木棍进行的。

 

输出描述:

对于每个询问输出一行表示答案,如果删除木棍后无法组成三角形则输出 -1 。

示例1

输入

6 2
1 2 3 4 5 6
6
5

输出

12
13

解题思路:

        构成三角形的原则是任意两边之和大于第三边,且题目要求求周长最大的三角形,那么木棍按长度排序后,选取最长的三个木棍判断是否构成三角形。如果不构成三角形,更换第二长的或第三长的也无法构成三角形(因为第二长和第三长的木棍已经是剩下木棍中长度和最大的),所以此时舍弃最长的木棍向后查找直到找到即可,时间复杂度O(n)。

        int最大值为2147483647,而木棍长度最大值为10^9,3根木棍的长度和可能大于int最大值,所以最后结果需要用long long存储。

AC代码:

#include <iostream>
#include <algorithm>
 
using namespace std;
//排序会打乱下标,而题目对于每个询问需要排除指定下标的木棍,所以用结构体记录原下标
struct Elem {
    int index, length;
};

bool cmp(Elem a, Elem b){
    return a.length > b.length;
}

int main(){
    int n, q;
    Elem a[100001] = {};
    cin >> n >> q;
    for(int i = 0; i < n; i++){
        //index + 1与题目输入对应
        a[i].index = i + 1;
        cin >> a[i].length;
    }
    //对长度进行降序排序
    sort(a, a + n, cmp);
    while(q--){
        int t;
        cin >> t;
        //默认选取最大的3个(记录下标)
        int choose_index[3] = {0, 1, 2};
        do{
            if(choose_index[2] >= n){
                break;
            }  
            //如果不能构成三角形
            if(a[choose_index[2]].length + a[choose_index[1]].length <= a[choose_index[0]].length){
                //舍弃最大的
                choose_index[0]++;
                //重复的下标后移
                for(int i = 1; i < 3; i++){
                    if(choose_index[i] == choose_index[i - 1]){
                        choose_index[i]++;
                    }
                }
            }
            if(choose_index[2] >= n){
                break;
            }
            //判断是否有被舍弃的木棍
            for(int i = 0; i < 3; i++){
                if(a[choose_index[i]].index == t){
                    choose_index[i]++;
                }
            }
            for(int i = 1; i < 3; i++){
                if(choose_index[i] == choose_index[i - 1]){
                    choose_index[i]++;
                }
            }
            //如果较短的两边之和小于第三边,则继续选择
        }while(choose_index[2] < n && a[choose_index[2]].length + a[choose_index[1]].length <= a[choose_index[0]].length);
        //如果越界说明找完了也没有符合条件的木棍
        if(choose_index[2] >= n){
            cout << -1 << endl;
        } else {
            long long sum = 0;
            for(int i = 0; i < 3; i++){
                sum += a[choose_index[i]].length;
            }
            cout << sum << endl;
        }
    }
}

 

【SCI复现】含可再生能源与储能的区域微电网最优运行:应对不确定性的解鲁棒性与非预见性研究(Matlab代码实现)内容概要:本文围绕含可再生能源与储能的区域微电网最优运行展开研究,重点探讨应对不确定性的解鲁棒性与非预见性策略,通过Matlab代码实现SCI论文复现。研究涵盖多阶段鲁棒调度模型、机会约束规划、需求响应机制及储能系统优化配置,结合风电、光伏等可再生能源出力的不确定性建模,提出兼顾系统经济性与鲁棒性的优化运行方案。文中详细展示了模型构建、算法设计(如C&CG算法、大M法)及仿真验证全过程,适用于微电网能量管理、电力系统优化调度等领域的科研与工程实践。; 适合人群:具备一定电力系统、优化理论和Matlab编程基础的研究生、科研人员及从事微电网、能源管理相关工作的工程技术人员。; 使用场景及目标:①复现SCI级微电网鲁棒优化研究成果,掌握应对风光负荷不确定性的建模与求解方法;②深入理解两阶段鲁棒优化、分布鲁棒优化、机会约束规划等先进优化方法在能源系统中的实际应用;③为撰写高水平学术论文或开展相关课题研究提供代码参考和技术支持。; 阅读建议:建议读者结合文档提供的Matlab代码逐模块学习,重点关注不确定性建模、鲁棒优化模型构建与求解流程,并尝试在不同场景下调试与扩展代码,以深化对微电网优化运行机制的理解。
根据用户提供的关键词“小A 弹吉他 网 小白 108 比详情 参攻略”,以下是整合后的相关信息和建议: --- ### 关于小白108的比详情 小白是由网主办的一系列面向编程爱好者的在线竞之一。第108场事通常会围绕算法、数据结构以及实际问题解决能力展开挑战。比题目可能涉及但不限于字符串处理、动态规划、图论等领域。 对于与“小A弹吉他”相关的具体题目,可能是某道以音乐或乐器为主题的趣味性算法题。这类题目往往需要结合数学建模能力和逻辑推理技巧来完成解答。 --- ### 如何准备此类比? #### 方法一:熟悉常见算法模板 确保掌握基础的数据结构(如栈、队列)及经典算法模型(例如深度优先搜索DFS、广度优先搜索BFS)。针对可能出现的音符序列匹配或者节奏计算等问题提前复习KMP模式匹配法等相关知识点。 #### 方法二:模拟真实考场环境练习 利用过往的小白记录进行刷题训练,在规定时间内尝试独立解决问题从而提升临场发挥水平。同时注意控制提交频率避免因超时错误而扣分过多。 #### 方法三:学习优秀选手思路分享 访问社区查看往届高排名玩家的经验贴。他们可能会提到如何快速理解复杂描述型试题的方法论;也可能提供一些特别好用但容易被忽略掉的小技巧比如调试输出设置等细节优化方案。 --- ### 示例代码片段供参考(假设存在一个简单版本的问题) 如果遇到类似判断两个旋律是否相同类型的程序设计,则可以考虑如下实现方式: ```python def is_same_melody(melody_a, melody_b): return melody_a == melody_b melody_A = list(map(int, input().split())) melody_B = list(map(int, input().split())) if len(melody_A) != len(melody_B): print("No") else: if is_same_melody(melody_A,melody_B): print("Yes") else: print("No") ``` 此段落仅为示意用途,请依据实际情况调整适应不同难度等级下的业务场景需求。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值