139 - Telephone Tangles
Moderator: Board moderators
One of those really murky things on this page is how they put a picture for the output and expect us to figure out what's going on.
Okay, problem 139. It looked really easy so I tried it, not heeding that 2% success rate. And I seem to have a perfectly good program, but I don't get how you're supposed to output. Well, anybody help?
And while you're at it, can you look at this and tell me if I'm even close to being remotely done?
How can such a seemingly easy problem only have like 25 solvers? Am I missing something? This site should really give us test values for what we get wrong... that would be so useful.
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#ifdef ONLINE_JUDGE
#define ins cin
#define outs cout
#else
#define ins fin
#define outs fout
ifstream fin("myprog.in");
ofstream fout("myprog.out");
#endif
typedef struct {
char code[10];
char name[30];
int price;
} locality;
locality areas[10000];
int narea;
int main() {
int len, min, i, j;
char telly[20];
while(ins >> telly) {
if(strcmp(telly, "000000") == 0) break;
strcpy(areas[narea].code, telly);
len = 0;
for(;;) {
ins >> areas[narea].name[len];
if(areas[narea].name[len] == '$') break;
len++;
}
areas[narea].name[len++] = '';
ins >> areas[narea].price;
narea++;
}
outs.setf(ios::fixed);
outs.precision(2);
while(ins >> telly) {
if(telly[0] == '#') break;
ins >> min;
if(telly[0] != '0') {
outs << telly << " Local "
<< telly << " " << min << " 0.00 0.00n";
} else {
for(i = 0; i < narea; i++) {
len = strlen(areas.code);
for(j = 0; j < len; j++)
if(areas.code[j] != telly[j]) break;
if(j == len)
break;
}
if(i == narea) {
outs << telly << " Unknown "
<< min << " " << -1. << endl;
} else {
outs << telly << " " << areas.name << " "
<< &telly[len] << " " << min << " "
<< areas.price * .01 << " "
<< areas.price * min * .01 << endl;
}
}
}
return 0;
}
Okay, problem 139. It looked really easy so I tried it, not heeding that 2% success rate. And I seem to have a perfectly good program, but I don't get how you're supposed to output. Well, anybody help?
And while you're at it, can you look at this and tell me if I'm even close to being remotely done?
How can such a seemingly easy problem only have like 25 solvers? Am I missing something? This site should really give us test values for what we get wrong... that would be so useful.
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#ifdef ONLINE_JUDGE
#define ins cin
#define outs cout
#else
#define ins fin
#define outs fout
ifstream fin("myprog.in");
ofstream fout("myprog.out");
#endif
typedef struct {
char code[10];
char name[30];
int price;
} locality;
locality areas[10000];
int narea;
int main() {
int len, min, i, j;
char telly[20];
while(ins >> telly) {
if(strcmp(telly, "000000") == 0) break;
strcpy(areas[narea].code, telly);
len = 0;
for(;;) {
ins >> areas[narea].name[len];
if(areas[narea].name[len] == '$') break;
len++;
}
areas[narea].name[len++] = '';
ins >> areas[narea].price;
narea++;
}
outs.setf(ios::fixed);
outs.precision(2);
while(ins >> telly) {
if(telly[0] == '#') break;
ins >> min;
if(telly[0] != '0') {
outs << telly << " Local "
<< telly << " " << min << " 0.00 0.00n";
} else {
for(i = 0; i < narea; i++) {
len = strlen(areas.code);
for(j = 0; j < len; j++)
if(areas.code[j] != telly[j]) break;
if(j == len)
break;
}
if(i == narea) {
outs << telly << " Unknown "
<< min << " " << -1. << endl;
} else {
outs << telly << " " << areas.name << " "
<< &telly[len] << " " << min << " "
<< areas.price * .01 << " "
<< areas.price * min * .01 << endl;
}
}
}
return 0;
}
-
- Guru
- Posts: 724
- Joined: Wed Dec 19, 2001 2:00 am
- Location: Germany
Test this input with your program (the problem is not as easy as you thought):
Code: Select all
088925 Broad-wood$ 81
03 Arrow.town$ 38
0061 Australia$ 140
0911 N
Wow, your test case got me to correct my problem. Now I'm the 28th person to solve that one, and the 26th to get a presentation error. Haha, that's funny. Thanks for the help. Now my name is one the ranklist, smack right there, "Ho Seung Ryu," though I am kinda using excessive time & mem. I'll look into it later.
I have passed your case, but why I still got Wrong Answer?
Code:
/* @JUDGE_ID:6511NH 139 C "" */
#include <stdio.h>
#include <string.h>
#define MAXPLC 2000
char codes[MAXPLC][7];
char names[MAXPLC][26];
double fees[MAXPLC];
void main()
{
#ifdef ONLINE_JUDGE
FILE *fp=stdin;
#else
FILE *fp=fopen("139.in","r");
#endif
char buf[1023];
int i=0,j,k;
char *ptr;
char c;
char number[50];
int length;
float aprice;
while(1)
{
fgets(buf,sizeof(buf),fp);
if(!strcmp(buf,"000000n"))
break;
ptr = buf;
j=0;
while(*ptr!=' ')
{
codes[j++]=*ptr;
ptr++;
}
codes[j]='';
j=0;
ptr++;
while(*ptr!='$')
{
names[j++]=*ptr;
ptr++;
}
names[j]='';
ptr++;
sscanf(ptr,"%f",&aprice);
fees=aprice/100.0;
i++;
}
while(1)
{
memset(number,0,sizeof(number));
c=fgetc(fp);
if(c=='#')
break;
else
ungetc(c,fp);
fscanf(fp,"%s %dn",number,&length);
if(number[0]!='0')
printf("%-16s%-20s%15s%5d%6.2f%7.2fn",number,"Local",number,length,0.00,0.00);
else
{
for(j=0;j<i;j++)
{
ptr=strstr(number,codes[j]);
if(ptr==number)
{
ptr+=strlen(codes[j]);
if(strlen(ptr)<4 || (strlen(ptr)>10 && number[1]=='0') || (strlen(ptr)>7 && number[1]!='0'))
printf("%-16s%-35s%5d%13.2fn",number,"Unknown",length,-1.00);
else
printf("%-16s%-25s%10s%5d%6.2f%7.2fn",number,names[j],ptr,length,fees[j],fees[j]*length);
break;
}
}
if(j==i)
printf("%-16s%-35s%5d%13.2fn",number,"Unknown",length,-1.00);
}
}
}
Code:
/* @JUDGE_ID:6511NH 139 C "" */
#include <stdio.h>
#include <string.h>
#define MAXPLC 2000
char codes[MAXPLC][7];
char names[MAXPLC][26];
double fees[MAXPLC];
void main()
{
#ifdef ONLINE_JUDGE
FILE *fp=stdin;
#else
FILE *fp=fopen("139.in","r");
#endif
char buf[1023];
int i=0,j,k;
char *ptr;
char c;
char number[50];
int length;
float aprice;
while(1)
{
fgets(buf,sizeof(buf),fp);
if(!strcmp(buf,"000000n"))
break;
ptr = buf;
j=0;
while(*ptr!=' ')
{
codes[j++]=*ptr;
ptr++;
}
codes[j]='';
j=0;
ptr++;
while(*ptr!='$')
{
names[j++]=*ptr;
ptr++;
}
names[j]='';
ptr++;
sscanf(ptr,"%f",&aprice);
fees=aprice/100.0;
i++;
}
while(1)
{
memset(number,0,sizeof(number));
c=fgetc(fp);
if(c=='#')
break;
else
ungetc(c,fp);
fscanf(fp,"%s %dn",number,&length);
if(number[0]!='0')
printf("%-16s%-20s%15s%5d%6.2f%7.2fn",number,"Local",number,length,0.00,0.00);
else
{
for(j=0;j<i;j++)
{
ptr=strstr(number,codes[j]);
if(ptr==number)
{
ptr+=strlen(codes[j]);
if(strlen(ptr)<4 || (strlen(ptr)>10 && number[1]=='0') || (strlen(ptr)>7 && number[1]!='0'))
printf("%-16s%-35s%5d%13.2fn",number,"Unknown",length,-1.00);
else
printf("%-16s%-25s%10s%5d%6.2f%7.2fn",number,names[j],ptr,length,fees[j],fees[j]*length);
break;
}
}
if(j==i)
printf("%-16s%-35s%5d%13.2fn",number,"Unknown",length,-1.00);
}
}
}
-
- Guru
- Posts: 724
- Joined: Wed Dec 19, 2001 2:00 am
- Location: Germany
There will be something like this:
01 MYHOME$30
012 MYFREIND$40
000000
0123333333 50
#
the output will be:(p.s. I ignore the spaces)
0123333333 MYFRIEND 3333333 504.00 200.00
(50 and 4.00 stick together ,don't be afraid,just print it.)
MYHOME is not acceptable.Why?Because there id 8 digits after "01".It's illegal.
and if there is a input like this:
the spaces in front of name and the spaces between name should be printed
Good luck!
<font size=-1>[ This Message was edited by: FlyDeath on 2002-03-28 14:23 ]</font>
01 MYHOME$30
012 MYFREIND$40
000000
0123333333 50
#
the output will be:(p.s. I ignore the spaces)
0123333333 MYFRIEND 3333333 504.00 200.00
(50 and 4.00 stick together ,don't be afraid,just print it.)
MYHOME is not acceptable.Why?Because there id 8 digits after "01".It's illegal.
and if there is a input like this:
Code: Select all
03 MY GOD
000000
0333333 10
Good luck!
<font size=-1>[ This Message was edited by: FlyDeath on 2002-03-28 14:23 ]</font>
139 - Telephone Tangles
Why does the code get RE? Is the input data over 1000?
[c]
#include<stdio.h>
#include<string.h>
void main(void)
{
int n,x,time,len,y,z,point,len2;
double t;
char buffer[50],c;
struct telecom
{
char num[7],name[26];
double fee;
}data[1000];
for(n=0;;)
{
scanf("%s",buffer);
if(strcmp(buffer,"000000")==0)
break;
strcpy(data[n].num,buffer);
c=getchar();
gets(buffer);
for(x=0;buffer[x]!='$';x++)
data[n].name[x]=buffer[x];
data[n].name[x]='\0';
for(t=0,point=-1;buffer[x]!='\0';x++)
if(buffer[x]>='0' && buffer[x]<='9')
{
t=t*10+buffer[x]-'0';
if(point>=0)
point++;
}
else if(buffer[x]=='.')
point++;
for(x=0;x<point;x++)
t/=10;
data[n].fee=t;
n++;
}
while(1)
{
scanf("%s",buffer);
if(strcmp(buffer,"#")==0)
break;
scanf("%d",&time);
if(buffer[0]!='0')
{
printf("%-16sLocal%*s%7d 0.00 0.00\n",buffer,30,buffer,time);
}
else
{
for(x=0;x<n;x++)
{
len=strlen(data[x].num);
len2=strlen(buffer);
if(len>strlen(buffer) || len>15)
continue;
if(len>=3 && data[x].num[0]=='0' && data[x].num[1]=='0' && (len2-len<4 || len2-len>10))
continue;
if(len>=2 && data[x].num[0]=='0' && data[x].num[1]!='0' && (len2-len<4 || len2-len>7))
continue;
for(y=0;y<len;y++)
if(data[x].num[y]!=buffer[y])
break;
if(y==len)
break;
}
if(y==len)
{
printf("%-16s",buffer);
printf("%s",data[x].name);
for(z=0;z<35-strlen(data[x].name)-(strlen(buffer)-len);z++)
printf(" ");
for(z=len;buffer[z]!='\0';z++)
printf("%c",buffer[z]);
t=time;
printf("%7d%24.2lf%7.2lf\n",time,data[x].fee/100,t*data[x].fee/100);
}
if(x==n)
{
printf("%-16s",buffer);
printf("%-35s","Unknown");
printf("%7d",time);
printf("%31s\n","-1.00");
}
}
}
}
[/c]
[c]
#include<stdio.h>
#include<string.h>
void main(void)
{
int n,x,time,len,y,z,point,len2;
double t;
char buffer[50],c;
struct telecom
{
char num[7],name[26];
double fee;
}data[1000];
for(n=0;;)
{
scanf("%s",buffer);
if(strcmp(buffer,"000000")==0)
break;
strcpy(data[n].num,buffer);
c=getchar();
gets(buffer);
for(x=0;buffer[x]!='$';x++)
data[n].name[x]=buffer[x];
data[n].name[x]='\0';
for(t=0,point=-1;buffer[x]!='\0';x++)
if(buffer[x]>='0' && buffer[x]<='9')
{
t=t*10+buffer[x]-'0';
if(point>=0)
point++;
}
else if(buffer[x]=='.')
point++;
for(x=0;x<point;x++)
t/=10;
data[n].fee=t;
n++;
}
while(1)
{
scanf("%s",buffer);
if(strcmp(buffer,"#")==0)
break;
scanf("%d",&time);
if(buffer[0]!='0')
{
printf("%-16sLocal%*s%7d 0.00 0.00\n",buffer,30,buffer,time);
}
else
{
for(x=0;x<n;x++)
{
len=strlen(data[x].num);
len2=strlen(buffer);
if(len>strlen(buffer) || len>15)
continue;
if(len>=3 && data[x].num[0]=='0' && data[x].num[1]=='0' && (len2-len<4 || len2-len>10))
continue;
if(len>=2 && data[x].num[0]=='0' && data[x].num[1]!='0' && (len2-len<4 || len2-len>7))
continue;
for(y=0;y<len;y++)
if(data[x].num[y]!=buffer[y])
break;
if(y==len)
break;
}
if(y==len)
{
printf("%-16s",buffer);
printf("%s",data[x].name);
for(z=0;z<35-strlen(data[x].name)-(strlen(buffer)-len);z++)
printf(" ");
for(z=len;buffer[z]!='\0';z++)
printf("%c",buffer[z]);
t=time;
printf("%7d%24.2lf%7.2lf\n",time,data[x].fee/100,t*data[x].fee/100);
}
if(x==n)
{
printf("%-16s",buffer);
printf("%-35s","Unknown");
printf("%7d",time);
printf("%31s\n","-1.00");
}
}
}
}
[/c]
I've modified it and get WA.
[c]
#include<stdio.h>
#include<string.h>
void main(void)
{
int n,x,time,len,y,z,point,len2;
double t;
char buffer[50],c;
struct telecom
{
char num[7],name[26];
double fee;
}data[2000];
for(n=0;n<2000;)
{
scanf("%s",buffer);
if(strcmp(buffer,"000000")==0)
break;
strcpy(data[n].num,buffer);
c=getchar();
gets(buffer);
for(x=0;buffer[x]!='$';x++)
data[n].name[x]=buffer[x];
data[n].name[x]='\0';
for(t=0,point=-1;buffer[x]!='\0';x++)
if(buffer[x]>='0' && buffer[x]<='9')
{
t=t*10+buffer[x]-'0';
if(point>=0)
point++;
}
else if(buffer[x]=='.')
point++;
for(x=0;x<point;x++)
t/=10;
data[n].fee=t;
n++;
}
while(1)
{
scanf("%s",buffer);
if(strcmp(buffer,"#")==0)
break;
scanf("%d",&time);
if(buffer[0]!='0')
printf("%-16sLocal%*s%7d%24s%7s\n",buffer,30,buffer,time,"0.00","0.00");
else
{
for(x=0;x<n;x++)
{
len=strlen(data[x].num);
len2=strlen(buffer);
if(len>strlen(buffer) || len>15)
continue;
if(len>=3 && data[x].num[0]=='0' && data[x].num[1]=='0' && (len2-len<4 || len2-len>10))
continue;
if(len>=2 && data[x].num[0]=='0' && data[x].num[1]!='0' && (len2-len<4 || len2-len>7))
continue;
for(y=0;y<len;y++)
if(data[x].num[y]!=buffer[y])
break;
if(y==len)
break;
}
if(y==len)
{
printf("%-16s",buffer);
printf("%s",data[x].name);
for(z=0;z<35-strlen(data[x].name)-(len2-len);z++)
printf(" ");
for(z=len;buffer[z]!='\0';z++)
printf("%c",buffer[z]);
t=time;
printf("%7d%24.2lf%7.2lf\n",time,data[x].fee/100,t*data[x].fee/100);
}
if(x==n)
{
printf("%-16s",buffer);
printf("%-35s","Unknown");
printf("%7d",time);
printf("%31s\n","-1.00");
}
}
}
}
[/c]
[c]
#include<stdio.h>
#include<string.h>
void main(void)
{
int n,x,time,len,y,z,point,len2;
double t;
char buffer[50],c;
struct telecom
{
char num[7],name[26];
double fee;
}data[2000];
for(n=0;n<2000;)
{
scanf("%s",buffer);
if(strcmp(buffer,"000000")==0)
break;
strcpy(data[n].num,buffer);
c=getchar();
gets(buffer);
for(x=0;buffer[x]!='$';x++)
data[n].name[x]=buffer[x];
data[n].name[x]='\0';
for(t=0,point=-1;buffer[x]!='\0';x++)
if(buffer[x]>='0' && buffer[x]<='9')
{
t=t*10+buffer[x]-'0';
if(point>=0)
point++;
}
else if(buffer[x]=='.')
point++;
for(x=0;x<point;x++)
t/=10;
data[n].fee=t;
n++;
}
while(1)
{
scanf("%s",buffer);
if(strcmp(buffer,"#")==0)
break;
scanf("%d",&time);
if(buffer[0]!='0')
printf("%-16sLocal%*s%7d%24s%7s\n",buffer,30,buffer,time,"0.00","0.00");
else
{
for(x=0;x<n;x++)
{
len=strlen(data[x].num);
len2=strlen(buffer);
if(len>strlen(buffer) || len>15)
continue;
if(len>=3 && data[x].num[0]=='0' && data[x].num[1]=='0' && (len2-len<4 || len2-len>10))
continue;
if(len>=2 && data[x].num[0]=='0' && data[x].num[1]!='0' && (len2-len<4 || len2-len>7))
continue;
for(y=0;y<len;y++)
if(data[x].num[y]!=buffer[y])
break;
if(y==len)
break;
}
if(y==len)
{
printf("%-16s",buffer);
printf("%s",data[x].name);
for(z=0;z<35-strlen(data[x].name)-(len2-len);z++)
printf(" ");
for(z=len;buffer[z]!='\0';z++)
printf("%c",buffer[z]);
t=time;
printf("%7d%24.2lf%7.2lf\n",time,data[x].fee/100,t*data[x].fee/100);
}
if(x==n)
{
printf("%-16s",buffer);
printf("%-35s","Unknown");
printf("%7d",time);
printf("%31s\n","-1.00");
}
}
}
}
[/c]