题解 化学反应

2023-05-16

化学反应

Description

有 N 种不同的物质,每种物质有两个属性——“能量”和“活度”。 N 种中的任意两种物质都可以发生反应;反应放热为两种物质的“能量”之差加一再乘上“活度”的较大值。换句话说,设第 i 种物质的能量和活度分别为 Ai 和 Bi,则 i 和 j 反应的放热为

(| Ai-Aj |+1) * max(Bi, Bj)

现在你需要选出两种物质,最小化它们反应放出的热量。这个最小值是多少?

Input

本题包含多组测试数据,第一行为测试数据组数 T。
对于每组数据:
第一行一个正整数 N,表示物质种类数。
接下来 N 行每行两个正整数 Ai、 Bi,表示第 i 种物质的“能量”和“活度”。

Output

输出一行一个正整数,最小放热。 注意这个数可能需要 64 位整型来存储。

Sample Input

1
7
19 5
5 6
1 2
8 4
25 10
12 3
9 6

Sample Output

12

Hint

数据范围:
对于 40%的数据,N<=1000,T<=5
对于另外 20%的数据,N<=10^5,Ai、 Bi<=10^3,T=1
对于 100%的数据,N<=10^5,Ai、 Bi<=10^9,T<=40

Source

贪心,分治

 
 

解析

这题的解法非常的巧(qí)妙(pa)。

首先,暴力n肯定会炸!

所以,我们先以A为关键字从小到大排序(从小到大也可以)。

然后枚举每个物质i,

寻找离它最近且B不大于Bi的两个物质j1,j2.

因为最近,所以差肯定最小。

然后更新ans就行了。

然后就有人会问:

如果存在物质x,Bx>Bi且(abs(Ax-Ai)+1)*Bx(即热量)比上面的j1,j2更小。

那x岂不是被忽略了?

然而实际上,如果上面的方案真的可行的话,

那么在枚举到x时,答案就已经被更新了。

因此,就不用担心了。

最后,注意每组数据都要初始化ans(而且要大,我赋的是1e16)(爆零惨案)

 

 

上AC代码吧:


#include<bits/stdc++.h>
#define ll long long
using namespace std;

inline int read(){
    ll sum=0,f=1;char ch=getchar();
    while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
    return f*sum;
}

struct node{
    ll a,b;
}c[100001];
int n,T;
ll ans=0x3f3f3f3f;

bool cmp(node aa,node bb){
    return aa.a>bb.a;
}

int main(){
//    freopen("reaction.in","r",stdin);
//    freopen("reaction.out","w",stdout);
    T=read();
    while(T--){
        ans=1e16;
        n=read();
        for(int i=1;i<=n;i++) c[i].a=read(),c[i].b=read();
        sort(c+1,c+n+1,cmp);
        for(int i=1;i<=n;i++){
            ll ret=1e16;
            ll a1=ret,a2=ret;
            int j=i-1;
            while(j>0){
                if(c[j].b<=c[i].b){
                    a1=c[j].a;
                    break;
                }
                j--;
            }
            j=i+1;
            while(j<=n){
                if(c[j].b<=c[i].b){
                    a2=c[j].a;
                    break;
                }
                j++;
            }
            if(a1==ret&&a2==ret) continue;
            ans=min(ans,(ll)(min(abs(a1-c[i].a),abs(c[i].a-a2))+1)*c[i].b);
            //    cout<<"ans="<<ans<<endl;
        }
        printf("%lld\n",ans);
    }
    return 0;
}  

 

转载于:https://www.cnblogs.com/zsq259/p/10524804.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

题解 化学反应 的相关文章

随机推荐

  • ftp权限设置大全!!!

    1 xff0e 登录和对匿名用户的设置 write enable 61 YES 是否对登录用户开启写权限 属全局性设置 默认NO local enable 61 YES 是否允许本地用户登录FTP服务器 默认为NO anonymous en
  • Vmware-虚拟中的linux如何增加硬盘(转)

    启动虚拟机软件VMware后 xff0c 点机VM菜单选择Setting xff0c 然后在弹出地菜单中选择 xff1a Add命令进行添加硬盘操作 完成后启动虚拟机 1 建立分区 fdisk l查看磁盘分区情况 此时你会发现多了一个 de
  • depot_tools download CPID client for windows 设置代理

    Downloading CIPD client for windows amd64 from https chrome infra packages appspot com Failed to download the file check
  • linux查看glibc命令,centos怎么看glibc版本 Linux查看glibc版本方法

    日前Linux GNU glibc标准库的 gethostbyname函数爆出缓冲区溢出漏洞 xff0c 影响版本为Glibc 2 2到2 17 xff0c 包含2 2和2 17版本 如果您正在使用Linux服务器的话 xff0c 快看看你
  • 2范数和F范数的区别

    2范数和F范数是不同的 2范数表示矩阵或向量的最大奇异值 xff0c max svd X 而 F范数表示矩阵所有元素平方和的开方根 sqrt x i j X x i j 2 转载于 https www cnblogs com yinwei
  • Ubuntu ftp服务器搭建 + UltraEdit编辑FTP文件

    0 前言 xff1a xff08 请无视 xff09 最近在写一个Linux脚本 xff0c 在电脑装了Ubuntu的虚拟机来测试脚本效果 xff1b 可是用vim编辑脚本实在是太蛋疼 xff0c 于是就想到UltraEdit编写 xff0
  • Windows远程桌面多用户登录的问题

    RDP WRAPPER 同时登录 多用户补丁 解决系统更新导致无法多用户登录的问题 问题描述 xff1a 安装最新的Windows系统更新补丁后 xff0c 使用RDP Wrapper多用户补丁的共享主机不支持多用户登录 系统会提示登录远程
  • mac man汉化方法

    https www jianshu com p 615a0a46193a utm campaign 61 maleskine amp utm content 61 note amp utm medium 61 seo notes amp u
  • 常见开发语言擅长领域

    Python xff1a 机器学习 xff0c 数据科学还有Web开发 JavaScript xff1a Web开发 xff08 前端和后端 xff09 和游戏开发 Java xff1a 移动Android应用程序开发 xff0c 企业应用
  • 【Arch安装】

    Arch安装 不完整 xff0c 凭记忆补充 1 xff0c 制作安装介质 xff08 请跳转链接 xff1a https www archlinux org download xff09 2 xff0c 从UEFI模式启动后 xff0c
  • 关于 systemctl --user status 报错的问题

    关于 systemctl user enable mpd 报错 xff1a Failed to connect to bus No such file or directory 因为arch脚本中 xff0c systemctl 是 sud
  • RNA-Seq比对软件HISAT2的用法

    参考网址 xff1a http blog sciencenet cn blog 759995 990471 html 感谢原作者 转载于 https www cnblogs com lmt921108 p 7442839 html
  • curl: (1) Protocol 'http not supported or disabled in libcurl

    在windows中使用curl的时候 xff0c 命令为 curl 39 http localhost 9200 pretty 39 出现这个报错 curl 1 Protocol 39 http not supported or disab
  • Linux日志服务器配置

    配置日志服务器 环境 xff1a tibet xff1a 10 11 3 57 gaplinux xff08 日志服务器 xff09 xff1a 10 11 3 3 修改tibet上的 etc hosts xff0c 增加如下代码 xff1
  • Ubuntu16.04下配置ssh免密登录

    Ubuntu16 04下配置ssh免密登录 环境准备 xff1a 新建两台虚拟机 xff0c 而且两台虚拟机上都装有Ubuntu16 04的系统 xff0c 使两台虚拟机之间保持互通状态 分别为两台虚拟机命名为A B 假设我们要使A虚拟机免
  • linux slf4j找不到,SLF4J错误消息

    在本章中 xff0c 我们将讨论在使用SLF4J时获得的各种错误消息或警告以及这些消息的原因 含义 无法加载类 org slf4j impl StaticLoggerBinder 这是在类路径中没有提供SLF4J绑定时引起的警告 以下是完整
  • C#使用RabbitMQ

    1 说明 在企业应用系统领域 xff0c 会面对不同系统之间的通信 集成与整合 xff0c 尤其当面临异构系统时 xff0c 这种分布式的调用与通信变得越发重要 其次 xff0c 系统中一般会有很多对实时性要求不高的但是执行起来比较较耗时的
  • 安装rpm的mysql_linux下安装rpm格式的mysql

    1 下载安装包 官网下载 rpm格式安装包 xff0c 需要下面两个文件 xff1a MySQL server 5 0 26 0 i386 rpm MySQL client 5 0 26 0 i386 rpm 注 xff1a 官网下载时 x
  • 我的世界服务器怎么修改合成表,《我的世界》1.8原版自定义合成表教程 怎么自定义合成表...

    我的世界 1 8原版自定义合成方法 xff0c 很多玩家还不了解 xff0c 今天给大家带来玩家 真名 分享的 我的世界 1 8原版自定义合成表教程 xff0c 一起来看看吧 版本要求1 8 优点 xff1a 自定义 合成表数量可以很大 合
  • 题解 化学反应

    化学反应 Description 有 N 种不同的物质 xff0c 每种物质有两个属性 能量 和 活度 N 种中的任意两种物质都可以发生反应 xff1b 反应放热为两种物质的 能量 之差加一再乘上 活度 的较大值 换句话说 xff0c 设第