Una solución a la vida de una batería 1229

Inserte la descripción de la imagen aquí

Análisis:
Esta pregunta usa el algoritmo codicioso.

Idea personal uno (es solo una idea de que no se puede pasar el tiempo de espera):
use una matriz para registrar la vida útil de cada batería.
Lo que pensé al principio era encontrar el valor máximo y el segundo mayor valor de vida útil cada vez. (Se puede ordenar cada vez, pero la complejidad del tiempo es muy alta) Cada vez que el valor máximo y el siguiente valor más grande se restan por 0.5. (Porque 0.5 es un factor para cada batería) hasta que el siguiente valor más grande encontrado sea 0. —— El propósito es mantener tantas baterías como sea posible, de modo que cada vez que use una batería con una vida útil grande.

Idea dos:
cambiar la forma, comenzar con los resultados.
Encuentra la vida y la suma de todas las baterías.
Si sum (and) -max (valor máximo) <= max, significa que se han consumido otras baterías y no pueden (o simplemente) compensar la vida útil de max, entonces el resultado es el límite de la suma de la vida útil de la batería pequeña, sum-max.
Si sum (max) -max (valor máximo)> max, significa que el valor de n debe ser> = 3. (Solo pueden ocurrir tres o más en este caso), en este caso, la batería se puede cambiar a mitad de camino Por lo tanto, cada batería puede ser un número entero, incluso múltiplo de 0,5 horas. Para estos números pares, debe coordinarse (puede verse como 0,5 de dos baterías diferentes consumidas cada vez), de modo que todas las baterías estén agotadas. Entonces el resultado es suma / 2;

Código:
Idea uno (el código de tiempo de espera no puede terminar)

#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;

//思路:公约数 半个小时。 
//尽量选取两个较大的数的半个小时,保证有更多的没有用完的电池 

double r[1001];
double a[1001]; 
int m_sort(int s,int t)//归并排序
{
 if(s==t)
  return 0;
 int mid=(s+t)/2;
 m_sort(s,mid);
 m_sort(mid+1,t);
 
 int i=s,j=mid+1,k=s;
 while(i<=mid&&j<=t)
 {
  if(a[i]<=a[j])
  {
   r[k]=a[i];
   k++;
   i++;
  }
  else
  {
   r[k]=a[j];
   k++;
   j++;
  }
  
 }
 while(i<=mid)
 {
  r[k]=a[i];
  k++;
  i++;
 }
 while(j<=t)
 {
  r[k]=a[j];
  k++;
  j++;
 }
 
 for(int i=s;i<=t;i++)
  a[i]=r[i];
}


int main()
{
 int n;
 int nm=0;//记录可以用几个半个小时 
 int max_z,max_ci; 
 while(scanf("%d",&n)!=EOF)
 {
  nm=0; 
  for(int i=1;i<=n;i++)
  {
   cin>>a[i];
  }
  a[0]=0;
  m_sort(1,n);//排序 
  max_z=n;
  max_ci=n-1;//每次找最大和次大的两个值 
  while(a[max_ci]!=0)//直到第二大的那个为0 ,就剩1节电池或者没有电池了为止 
  {
   nm++;
   a[max_z]=a[max_z]-0.5;
   a[max_ci]=a[max_ci]-0.5;
   max_z=max_ci=0;//每次的初始化 
   for(int i=1;i<=n;i++)//先找最大值 
   {
    if(a[i]>a[max_z])
     max_z=i;
   }
   for(int i=1;i<=n;i++)//再找次大值 
   {
    if(a[i]>a[max_ci]&&max_z!=i)
     max_ci=i; 
   }
  }
  printf("%.1f\n",(float)nm/2);
 }
 return 0;
 } 

Código 2: puedes pasar

#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
//思路:
//求一下sum总和,如果sum减去最大值小于最大值max就说明没有什么组合可以更大的抵消最大值,结果就是其他值轮番消耗最大值,小电池的和的极限,即sum-max。 
//第二种情况是sum减去最大值大于了大值,这种情况的结果是sum的一半。因为这样n一定会>=3,当>=3时就可以出现换电池的情况,因为每一个电池都是0.5的偶数倍,所以一定可以协调全部用完 
double r[1001];
double a[1001]; 
int m_sort(int s,int t)//归并排个序 
{
 if(s==t)
  return 0;
 int mid=(s+t)/2;
 m_sort(s,mid);
 m_sort(mid+1,t);
 
 int i=s,j=mid+1,k=s;
 while(i<=mid&&j<=t)
 {
  if(a[i]<=a[j])
  {
   r[k]=a[i];
   k++;
   i++;
  }
  else
  {
   r[k]=a[j];
   k++;
   j++;
  }
  
 }
 while(i<=mid)
 {
  r[k]=a[i];
  k++;
  i++;
 }
 while(j<=t)
 {
  r[k]=a[j];
  k++;
  j++;
 }
 
 for(int i=s;i<=t;i++)
  a[i]=r[i];
}


int main()
{
 int n;
 double sum=0;
 while(cin>>n)
 {
  sum=0;
  for(int i=1;i<=n;i++)
  {
   cin>>a[i];
   sum+=a[i];//求和 
  }
 // cout<<sum<<endl;
  m_sort(1,n);//排一下序
  double max_s=a[n];//求出最大值 
  if(sum-max_s<=max_s)//第一种 
   printf("%.1lf\n",sum-max_s);
  else if(sum-max_s>max_s)//第二种 
   printf("%.1lf\n",sum/2);
  
 }
 
 return 0;
}

————————————————
Declaración de derechos de autor: Este artículo es un artículo original del blogger de CSDN "Listen to the Bamboo Wind", que sigue el acuerdo de derechos de autor CC 4.0 BY-SA. Adjunte el enlace original y vuelva a imprimir Esta declaración
Enlace original: https://blog.csdn.net/qq_40575034/article/details/103338672

Publicado 33 artículos originales · me gusta 0 · visitas 167

Supongo que te gusta

Origin blog.csdn.net/weixin_42790071/article/details/105430215
Recomendado
Clasificación