ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1184. Cable Master

Cable Master: I can't find my error, i think my program is Ok(+) Anyone help me :)
Послано Miguel Angel 28 май 2002 10:24
Here it is:

#include<iostream.h>
#include<stdio.h>

int  n, k;
long x[10000];

void main()
{
double xx;
int i, j;
    cin>>n>>k;
    for (i=0; i<n; i++)
    {
        cin>>xx;
        x[i] = xx*100;
    }
long l, r, m, w;
    r = x[0];
    for (i=1; i<n; i++)
        if (x[i]>r) r=x[i];
    l = 1;
    w = 0;
    while ( l <= r )
    {
        m = (l + r) / 2;
        j = 0;
        for (i=0; i<n; i++)
              j = j + (long)x[i]/m;
        if ( j == k )
        {
            w = m;
        }
        if (j >= k)
            l = m + 1;
        else
            r = m - 1;
    }
double ans = (double)w/100.0;
    printf("%.2f\n",ans);
}
Two mistake.
Послано ECUST Multistar 28 май 2002 11:42
I'm not good at C++.
I like Dephi and C more than C++.
But I had correct your program...
Do you have E-mail?
I'll send it to you
Two mistakes
Послано ECUST Multistar 28 май 2002 11:56
Well......
The first error is
x[i] = xx*100;
You should have replaced the line to
x[i]=(long)(xx*100+0.1);
Try the testcase
4 4
2.01
2.01
2.01
2.01
Your program output a wrong answer
2.00
:-)

The second one

Why do you think that the cable must be cut into exactly k pieces?
So you must change

    if ( j == k )
        {
            w = m;
        }

into



  if (j>=k && w>m)
    {w=m;}
Wow, how did you know the first mistake?? Lot of thanks :) (+)
Послано Miguel Angel 30 май 2002 09:55
Could you explain me why x[i] = (long)(x*100 + 0.1), how did you know
0.1??
Thanks :)
HeHe:)
Послано ECUST Multistar 30 май 2002 16:41
We can try to this code.
double n=2.01;
long x;
x=(long)(x*100);
I was surprised that the result is 200?
I can't understood it also.

Then this code

double n=2.01,t;
long x;
t=n*100;
x=(long) t;
You can find out that
  t=201.00000
but
  x was still 201.
So I use (n*100+0.1) instead Then I use your program to got AC

By the way .
I like C more than C++ beacuse I don't kown C++ well

If I made any mistake in this problem please forgive me.:-)
Good luck.