| | | Show all threads     Hide all threads     Show all messages     Hide all messages |  | If WA8, here's hint | wangbicheng1 | 1184. Cable Master | 21 Mar 2022 23:57 | 2 |  | Notice that the number of pieces you cut the cables needn't be precisely equal to k. Just >=k is OK. |  | WA9 | George_Aloyan[PTS Obninsk] | 1184. Cable Master | 21 Feb 2022 16:47 | 2 |  | WA9 George_Aloyan[PTS Obninsk] 11 Jan 2012 22:27 Set types as long long for variables used as sum of cables lengthsRe: WA9 Name-must-be-given-in-English 21 Feb 2022 16:47 For me, what worked was replacing "%i"'s with "%d"'s in scanf's. :) |  | If you are getting WA12 | andreyDagger | 1184. Cable Master | 24 Sep 2021 16:07 | 1 |  | Try this:1 5
 1.00
 answer: 0.20
 |  | No subject | Arlen | 1184. Cable Master | 2 Apr 2021 18:10 | 1 |  |  
 Edited by author 02.04.2021 18:58
 |  | Possible mistake | lallala | 1184. Cable Master | 20 Sep 2018 08:49 | 2 |  | if you read data as:double x;
 cin>>x;
 a[i]=x*100;
 it doesn't work!
 |  | Let binary_search help you! | Tigran92[RAU_902] | 1184. Cable Master | 5 Dec 2010 19:23 | 1 |  |  |  | can we do this task with binary  search????? | Bobur | 1184. Cable Master | 25 Nov 2010 16:18 | 3 |  | Yes, i use binary-search and got Ac in 0.046 s.
 GOOD LUCK!!!
 |  | Hint for you, if you have got WA#4 | Samvel (RAU) | 1184. Cable Master | 27 Jul 2008 15:02 | 1 |  | In test #4 n=10000 and k=1.You can write this case apart.
 |  | help, TLE#6, here is my code! | Bobur | 1184. Cable Master | 11 Apr 2008 23:37 | 1 |  | program Project1;
 {$APPTYPE CONSOLE}
 
 uses
 SysUtils;
 
 var
 i, j, m, n, maxa, x0, xn, x, p : integer;
 s : int64;
 l : real;
 a : array [1..10000] of integer;
 
 begin
 readLn(n, m);
 maxa := 0;    s := 0;
 for i := 1 to n do
 begin
 readLn(l);
 a[i] := round(100*l);
 s := s + a[i];
 if maxa < a[i] then maxa := a[i];
 end;
 if s div m < 1 then writeLn('0.00')
 else
 begin
 if m = 1 then writeLn(maxa/100:10:2)
 else
 begin
 xn := s div m;
 x0 := 0;
 repeat
 p := 0;
 x := (xn+x0) div 3;
 for i := 1 to n do
 inc(p, a[i] div x);
 if p >= m then x0 := x
 else xn := x;
 until p = m;
 for i := xn downto x0 do
 begin
 p := 0;
 for j := 1 to n do
 inc(p, a[j] div i);
 if p = m then begin writeLn(i/100:0:2);  halt;  end;
 end;
 end;
 end;
 end.
 |  | Wrong test or checker,Admins please check | dgorlov | 1184. Cable Master | 10 Dec 2007 14:59 | 2 |  | I use binary search to solve this problem and had troublewith input
 this input gots AC:
 double x;
 int j,t;
 fscanf(inf,"%lf",&x);
 L[i]=(int)(x*100.0+1e-9);
 but this got WA9
 fscanf(inf,"%i.%i",&t,&j);
 L[i]=t*100+j;
 output in boyh programs was like this
 fprintf(outf,"%i.%0.2i\n",ANS/100,ANS%100);
 
 possible reasons:
 1. input data hasn't 2 digits after decimal point(maybe it have none digits and no point at all)
 2. chacker is floating-point written program with do errors
 and you have to do the same errors to AC.
this code is wrongfscanf(inf,"%i.%i",&t,&j);
 L[i]=t*100+j;
 
 you must use scanf("%d", &x);
 instead of scanf("%i", &x);
 why ?
 try to input "09"
 %d reads it as 9, but %i reads some random thing
 |  | Who can tell me what's wrong with it? | Aleksei Zobnin | 1184. Cable Master | 18 Sep 2007 21:08 | 4 |  | #include <stdio.h>#include <math.h>
 
 int n, k;
 double * data;
 
 int ok (double z) {
 long s = 0;
 for (int i = 0; i < n; i++)
 s += floor (data[i] / z);
 return s >= k;
 }
 
 int main () {
 scanf ("%d%d", &n, &k);
 data = new double [n];
 double l;
 for (int i = 0; i < n; i++) {
 scanf ("%lf", &l);
 data[i] = l;
 }
 if (!ok(0.01)) {
 printf ("0.00\n");
 return 0;
 }
 double x = 0.01, y = 1e5, z;
 while (y - x >= 0.0001) {
 z = (x + y) / 2;
 if (ok(z)) x = z;
 else y = z;
 }
 printf ("%.2lf\n", z);
 return 0;
 }
Wrong Answer.
 simple test:
 5 10
 3.34
 2.34
 7.54
 1.87
 0.03
 
 your answer: 1.26
 
 but 7.54/1.25 = 5 (1.26*6 = 7.56)
 and you have only 9 cables with length 1.26:
 
 2   +  1   +   5   +  1  +   0   = 9
 3.34   2.34   7.54   1.87   0.03
 
 
 a have this mistake too :))
Wrong Answer.
 simple test:
 5 10
 3.34
 2.34
 7.54
 1.87
 0.03
 
 your answer: 1.26
 
 but 7.54/1.26 = 5 (1.26*6 = 7.56)
 and you have only 9 cables with length 1.26:
 
 2   +  1   +   5   +  1  +   0   = 9
 3.34   2.34   7.54   1.87   0.03
 
 
 a have this mistake too :))
But this is not a correct test..."Cable lenth is at least 1 meter"...
 |  | What if use integers instead of float? | SPIRiT | 1184. Cable Master | 23 Aug 2006 16:05 | 3 |  | I read every line containing a number. And after that simply read all digits (without a point) and convert into integer 1 cm=1. 100km=100*10^3m=100*10^5cm=10^7. In that range I use binary search for finding the maximum possible length. Why WA at test 1?  (Yeah, I sort the lens too)Here is a sample of code for converting:
 fgets(buf,150,INPUT_STREAM);
 tmp=0;
 j=0;
 while((buf[j]>='0'&&buf[j]<='9')||buf[j]=='.')
 {
 if(buf[j]!='.')tmp=tmp*10+buf[j]-'0';
 j++;
 }
 sum+=tmp;
 Lens[i]=tmp;
 
 Do the lengths always have exactly two digits
 
 Edited by author 22.08.2006 13:44
In fact you are right, you are to use in this problem integers instead of float and binary search. If you have wa#1 probaly you didn't understand problem...When I removed sorting the lens and set the right bound to 100 km (not to the maximal length possible), I've got AC. Can anyone explain why? This two features were just for speed, they don't change the idea of binary search itself, I still used it. What could be wrong? |  | please see it? It got WA. | zealot | 1184. Cable Master | 16 Jul 2004 19:05 | 7 |  | my solution:
 {$N+}
 program cable_master;
 const max=10000;
 var a:array[1..max] of real;
 n,k,s:integer;
 best,f,r,m:extended;
 procedure readdata;
 var i:integer;
 begin
 readln(n,k);
 for i:=1 to n do
 begin
 readln(a[i]);
 if a[i]>r then r:=a[i];
 end;
 end;
 function find:boolean;
 var i:integer;
 begin
 s:=0;
 for i:=1 to n do
 s:=s+trunc(a[i]/m);
 if s=k then find:=true
 else find:=false;
 end;
 procedure main;
 begin
 while r>=f do
 begin
 m:=(f+r)/2;
 if not find then
 begin
 if s>k then f:=f+0.001
 else r:=m;
 if abs(r-f)<0.00001 then break;
 end
 else
 begin
 if m>best then best:=m;
 if f=r then break;
 f:=f+0.001;
 end;
 end;
 best:=trunc(best*100);
 best:=best/100;
 writeln(best:0:2);
 end;
 BEGIN
 readdata;
 main;
 END.
> give some texts please.const    max    = 10000;
 var      a                :array[1..max] of longint;
 
 n,k              :word;
 
 dau,cuoi,giua,
 kq               :longint;
 
 ok               :boolean;
 
 
 procedure nhap;
 var    i       :word;
 x       :real;
 begin
 readln( n, k);
 
 for i := 1 to n do
 begin  readln( x);
 a[i] := round( x * 100);
 end;
 end;
 
 
 procedure cut;
 var    doan     :longint;
 i        :word;
 begin
 doan := 0;
 for i := 1 to n do
 begin
 doan := doan + a[i] div giua ;
 if doan >= k then break;
 end;
 
 ok :=  ( doan >= k );
 if ok and ( giua > kq ) then kq := giua;
 end;
 
 
 procedure solve;
 begin
 dau := 1; cuoi := 10000000; kq := 0;
 
 repeat
 giua := ( dau + cuoi ) div 2;
 
 cut;
 
 if ok then dau  := giua + 1
 else cuoi := giua - 1;
 until dau > cuoi;
 end;
 
 
 procedure out;
 var     x     :real;
 begin
 x := kq;
 x := x / 100;
 writeln(x :0 :2);
 end;
 
 
 begin
 nhap;
 solve;
 out;
 end.
uses math;const p=3.1415926535897;
 var a,r:integer;
 s,angl,cosa:real;
 begin
 readln (a,r);
 if (2*r<=a) then
 s:=p*r*r
 else
 if (sqrt(2)*a/2<r) then
 s:=a*a
 else
 begin
 cosa:=a/(2*r);
 angl:=2*arccos(cosa);
 angl:=p/2-angl;
 s:=((a/2)*sqrt(r*r-(a*a)/4))+angl*r*r/2;
 s := s * 4;
 end;
 writeln (s:0:3);
 end.
 
My program is like yours.But if i use a[i] := trunc( x * 100),it's WA.
 And if i use a[i] := round( x * 100),it will be AC.
 Is there something different from the two ways in this problem?
 Isn't the input with exactly two digits after a decimal point?
 |  | Cable Master : I can't find my bug. Here is my code | Badd | 1184. Cable Master | 21 Dec 2002 18:01 | 1 |  | // My algorithm is about binary search
 #include <stdio.h>
 #include <stdlib.h>
 #define maxd 10005
 float d[maxd],m=0.0;
 long k,n;
 int check(float w)
 {
 long l,s=0;
 for (l=0; l<n; l++)
 {
 if (s>=k) return 1;
 if (w>d[l]) return -1;
 s+=(long)(d[l]/w);
 }
 if (s>=k) return 1;
 return -1;
 }
 int sort_function(const void*a,const void*b)
 {
 if ((*(float*)a)>(*(float*)b)) return -1;
 if ((*(float*)a)==(*(float*)b)) return 0;
 return 1;
 }
 int main()
 {
 long l;
 float a,b,c,tmp;
 FILE* fname=stdin;
 FILE* fout=stdout;
 fscanf(fname,"%ld%ld",&n,&k);
 for (l=0; l<n; l++) fscanf(fname,"%f",&d[l]);
 qsort((void*)d,n,sizeof(d[0]),sort_function);
 c=(float)((long)((long)100*(long)(1+10000)/2))/100.0;
 for (a=1,b=10000; a<=b; c=(float)(a+b)/2.0 )
 {
 if (check(c)==1)
 { if (c>m)
 m=c;
 tmp=a;
 a=c+0.01;
 a=(float)((long)
 (100.0*a))/100.0;
 if (a==tmp) break;
 }
 else
 {
 b=c-0.01;
 b=(float)((long)
 (100.0*b))/100.0;
 }
 }
 m=((long)(m*100))/100.0;
 fprintf(fout,"%.2f\n",m);
 fclose(fname); fclose(fout);
 return 0;
 }
 |  | Cable Master: I can't find my error, i think my program is Ok(+) Anyone help me :) | Miguel Angel | 1184. Cable Master | 30 May 2002 16:41 | 5 |  | 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);
 }
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
Could you explain me why x[i] = (long)(x*100 + 0.1), how did you know0.1??
 Thanks :)
HeHe:) ECUST Multistar 30 May 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.
 
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;}
 
 |  | Why I have ACCESS_VIOLATION (C++) ? | sikee8 | 1184. Cable Master | 10 Apr 2002 21:22 | 1 |  | #include <iostream.h>
 int n,k;
 long m [10000],how [10000];
 
 long GetNewLength ()
 {
 long NewLength = 0;
 for (int i=1; i<=n; i++)
 if (m[i]/(how[i]+1) > NewLength) NewLength = m[i]/(how
 [i]+1);
 return NewLength;
 }
 
 int main ()
 {
 long nowLength = 2147483648, nowN = 0;
 double length;
 cin >> n >> k;
 for (int i=1; i<=n; i++)
 {
 cin >> length;
 m [i] = int (length * 100);
 if (m[i] < nowLength) nowLength = m [i];
 }
 while (nowN<k && nowLength != 0)
 {
 nowLength = GetNewLength ();
 if (!nowLength) continue;
 nowN = 0;
 for (i=1; i<=n; i++)
 {
 how [i] = m [i] / nowLength;
 nowN = nowN + how [i];
 }
 }
 cout << nowLength/100 << ".";
 int tens = nowLength%100;
 if (tens < 10) cout << "0" << tens;
 else cout << tens;
 return 0;
 }
 |  | Could anyone help me?(+) | shitty.Mishka | 1184. Cable Master | 30 Mar 2002 15:28 | 2 |  | What could be wrong with this code?
 Program Easy;
 Const Max=10006;
 Var i,n,k:Longint;
 a:Array[1..Max] Of Longint;
 x,y,z:Longint;
 u,q:Real;
 Function ok(l:Longint):Boolean;
 Var i,s:Longint;
 Begin
 s:=0;
 For i:=1 To n Do
 s:=s+a[i] Div l;
 ok:=s>=k;
 End;
 Begin
 { Assign(Input,'1184.in'); Reset(input);{}
 Read(n,k);
 y:=10000000;
 For i:=1 To n Do Begin
 Read(u);
 a[i]:=Round(u*100);
 End;
 x:=1;
 If Not ok(x) Then Begin
 Writeln('0.00');
 Halt;
 End;
 While y-x>1 Do Begin
 z:=(y+x) Div 2;
 If ok(z) Then
 x:=z
 Else
 y:=z;
 End;
 While Not ok(z) Do
 z:=z-1;
 While Ok(z+1) Do
 z:=z+1;
 q:=z;
 q:=q/100;
 Writeln(q:0:2);
 End.
 |  | Please help me. I get WA. | raxtinhac | 1184. Cable Master | 6 Mar 2002 07:10 | 3 |  | Here is my programme:
 const    max    = 10000;
 
 var      a                :array[1..max] of longint;
 
 n,k              :word;
 
 dau,cuoi,giua,
 kq               :longint;
 
 ok               :boolean;
 
 
 procedure nhap;
 var    i       :word;
 x       :real;
 begin
 readln( n, k);
 
 for i := 1 to n do
 begin  readln( x);
 a[i] := trunc( x * 100);
 end;
 end;
 
 
 procedure cut;
 var    doan     :longint;
 i        :word;
 begin
 doan := 0;
 for i := 1 to n do
 begin
 doan := doan + a[i] div giua ;
 if doan >= k then break;
 end;
 
 ok :=  ( doan >= k );
 if ok and ( giua > kq ) then kq := giua;
 end;
 
 
 procedure solve;
 begin
 dau := 1; cuoi := 10000000; kq := 0;
 
 repeat
 giua := ( dau + cuoi ) div 2;
 
 cut;
 
 if ok then dau  := giua + 1
 else cuoi := giua - 1;
 until dau > cuoi;
 end;
 
 
 procedure out;
 var     x     :real;
 begin
 x := kq;
 x := x / 100;
 writeln(x :0 :2);
 end;
 
 
 begin
 nhap;
 solve;
 out;
 end.
Hmm I have answers to all your questions :) 5 Mar 2002 20:56 use round instead of trunc please ;) | 
 | 
 |