zoukankan      html  css  js  c++  java
  • COJN 0484 800502电池的寿命

    800502电池的寿命
    难度级别:B; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
    试题描述

    小S新买了一个掌上游戏机,这个游戏机由两节5号电池供电。为了保证能够长时间玩游戏,他买了很多5号电池,这些电池的生产商不同,质量也有差异,因而使用寿命也有所不同,有的能使用5个小时,有的可能就只能使用3个小时。显然如果他只有两个电池一个能用5小时一个能用3小时,那么他只能玩3个小时的游戏,有一个电池剩下的电量无法使用,但是如果他有更多的电池,就可以更加充分地利用它们,比如他有三个电池分别能用3、3、5小时,他可以先使用两节能用3个小时的电池,使用半个小时后再把其中一个换成能使用5个小时的电池,两个半小时后再把剩下的一节电池换成刚才换下的电池(那个电池还能用2.5个小时),这样总共就可以使用5.5个小时,没有一点浪费。现在已知电池的数量和电池能够使用的时间,请你找一种方案使得使用时间尽可能的长。

    输入
    输入包含多组数据。每组数据包括两行,第一行是一个整数N (2 ≤ N ≤ 1000),表示电池的数目,接下来一行是N个正整数表示电池能使用的时间。
    输出
    对每组数据输出一行,表示电池能使用的时间,保留到小数点后1位。
    输入示例
    2
    3 5
    3
    3 3 5
    输出示例
    3.0
    5.5
    其他说明
    数据范围:输入中已经说明。

    题解:很奇妙的题。首先,如果最大的那个电池比其他(n-1)个的和还要大,那么最好的方案就是轮流用,答案是那(n-1)个的和。

    如果不是,窝萌可以先想一想电池是否会被用完,答案是肯定的。

    证明:如果不比其它(n-1)个电池的和要大,那么窝萌这么想:先用那个最大的去削第二大的(动态更新第二大),那么早晚有一天最大的会撑不住(因为它比其他的电池和要小,不能横扫千军嘛),于是它成为了第二大。。。如此往复,那么所有的电池会经历排名逐渐提升再下降的人生,所以窝萌可以说电池的电量是平均的,然后自己再YY一下就知道电池肯定能用完。。。

    那就好办了,答案就是总和除以2呗?

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<queue>
     6 #include<cstring>
     7 #define PAU putchar(' ')
     8 #define ENT putchar('
    ')
     9 using namespace std;
    10 const int maxn=1000+10;
    11 int n,A[maxn];
    12 inline int read(){
    13     int x=0,sig=1;char ch=getchar();
    14     for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=0;
    15     for(;isdigit(ch);ch=getchar())x=10*x+ch-'0';
    16     return sig?x:-x;
    17 }
    18 inline void write(int x){
    19     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
    20     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
    21     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
    22 }
    23 void init(){
    24     double ans;
    25     while(scanf("%d",&n)==1){
    26         ans=0;
    27         for(int i=1;i<=n;i++){
    28             A[i]=read();ans+=A[i];
    29         }sort(A+1,A+n+1);
    30         if(A[n]>ans-A[n])ans=ans-A[n];
    31         else ans=ans*0.5;
    32        printf("%.1f
    ",ans);
    33     }
    34     return;
    35 }
    36 void work(){
    37     return;
    38 }
    39 void print(){
    40     return;
    41 }
    42 int main(){init();work();print();return 0;}
  • 相关阅读:
    使用 yo 命令行向导给 SAP UI5 应用添加一个新的视图
    SAP Fiori Elements 应用的 manifest.json 文件运行时如何被解析的
    SAP UI5 标准应用的多语言支持
    微软 Excel 365 里如何设置下拉菜单和自动高亮成指定颜色
    SAP Fiori Elements 应用里的 Title 显示的内容是从哪里来的
    本地开发好的 SAP Fiori Elements 应用,如何部署到 ABAP 服务器上?
    如何在 Cypress 测试代码中屏蔽(Suppress)来自应用代码报出的错误消息
    教你一招:让集群慢节点无处可藏
    应用架构步入“无服务器”时代 Serverless技术迎来新发展
    MySQL数据库事务隔离性的实现
  • 原文地址:https://www.cnblogs.com/chxer/p/4675303.html
Copyright © 2011-2022 走看看