1242: ejecutivos de cable

título

1242: ejecutivos de cable

Descripción [title]

País de las maravillas residentes decidieron llevar a cabo una programación torneo regional. Comité árbitro compuesto en su totalidad por voluntarios, su compromiso con la organización de la mayoría sólo una vez en la historia del juego. Decidieron conectar los jugadores de la computadora con topología en estrella en conjunto, todos ellos están a punto de conectarse a un único servidor central. Con el fin de organizar esta competición es completamente justo, Presidente de la Comisión de Arbitraje propuso a todos los jugadores de todo el equipo equidistantes colocados alrededor del servidor. Para la compra de cable, el árbitro Comisión en contacto con un proveedor de soluciones de red local, debe proporcionar un cierto número de cable de longitud igual. Comité de Árbitros de espera por cable, siempre que sea posible, de modo que la distancia entre la lata por lo que algunos de los jugadores.

ejecutivos de cable de la compañía para llevar a cabo esta tarea. Él sabía que la longitud de cada cable de red de inventario (precisión de centímetros), y le dijo que siempre que la longitud de cable necesaria (precisión de centímetros), que será capaz de completar el trabajo de cortar el cable. Sin embargo, esta vez, la longitud del cable requerido no sabe, lo que hace que los ejecutivos de cable en una pérdida.

Es necesario escribir un programa que ayuda a determinar una red de ejecutivos de cable más largo de la longitud del cable y la longitud Haga clic en el inventario del corte del cable, se puede especificar el número de cable de red.

[Enter]

La primera línea contiene dos enteros N y K, separadas por un solo espacio. N (1 ≤ N ≤ 10000) es el número de inventario cable, K (1 ≤ K ≤ 10000 ) es el número de cables necesarios.
Siguiente N líneas de un número de acciones de cada longitud de cable (unidad: m). Toda la longitud del cable es de al menos 1 m, hasta 100 km. Las longitudes de todas las entradas tienen una precisión de centímetros, es decir, retienen a dos cifras decimales.

[Salida]

cable competente puede ser cortado de un número especificado de cables de un inventario de la red de cable de mayor longitud (unidad: m). Hay que tener una precisión al centímetro, que está reservada a dos cifras decimales.
Si no puede obtener una longitud de al menos 1 cm número especificado de cable, éste debe de salida "0.00" (sin las comillas).

[Entrada de la muestra]

4 11
8,02
7,43
4,57
5,39

[Salida de muestra]

2.00

Ver código

 

[Análisis]

这个题目其实不太难想的,因为:从数据规模来看,n<=10000,k<=10000,每条线的最大长度100km,换成厘米10^8,怎么看数据还是可以接受的。时间复杂度可以做到O(n2)级,这个时间复杂度对大多题目都够的;方法嘛,应该可以想到二分答案值。最小1cm,最大100km,精确到cm,那就是二分了。
但是:这个题却让我修改了多次。(可能是我笨)。这里面有几个小问题需要考虑清楚。1、我第一次做出的答案样例都没过,我给出的答案是2.01,细查答案的实际值为2.005(可以手动算的,这个值没毛病),保留两位小数自然就2.01了。带给我的思考是:尾数如何收舍才合理?显然四舍五入是行不通的。去尾法也让人举棋不定,我们还得考虑另外一个问题,数值类型一般选用double,就算是2.00在内部存储也可能是1.99999999999997,你来个去尾必须被K.O。解决这个问题好像也不太难,答案+0.000001再去尾。那么恭喜你,你可能能得到80分。2、注意到题目中多次提到各方面数据都精确到cm,那好,我们直接以cm为单位,那就全是整数了。这个想法让我也是一阵兴奋,马上动手修改,抛掉那个尾数处理的烦恼。结果是:70分。3、应该说问题不大啊,怎么会呢?再细查一遍,好像都没问题啊。终于,发现一个漏洞:以cm为单位,最长100km,那就是10^8,要是多来几个100km,得到的网线段数......,我去,还有这事儿,有了刚才的打击,这次不敢高兴,只有试试的态度了,改int为long long,嘿,还真给力,问题解决。好吧,不讲故事了,翠花,上酸菜

AC代码

//1242:网线主管 
#include<iostream>
#include<iomanip>
using namespace std;
int const N=1e4+1;
long long  b[N],ans,n,s;
double t;
long long  ts(int x)
{
    long long int num=0;
    for(int i=1;i<=n;i++)num+=b[i]/x;
    return num;
}
int f(int l,int r)
{
    int m=(l+r)/2;
    if(r-l<=1)return l;
    if(ts(m)>=s)return f(m,r);
    else return f(l,m);
}
int main(){
    cin>>n>>s;
    for(int i=1;i<=n;i++)
    {
        cin>>t;
        b[i]=t*100+0.1;
    }
    if(ts(1)<s)ans=0;
    else if(ts(1e8)>=s)ans=1e8;
    else ans=f(1,1e8);
    cout<<fixed<<setprecision(2)<<ans/100.0+0.0001;
    return 0;
}

 

Supongo que te gusta

Origin www.cnblogs.com/wendcn/p/12578431.html
Recomendado
Clasificación