#16748: 超時


andy406031211@gmail.com (meow)

學校 : 不指定學校
編號 : 90635
來源 : [114.35.252.154]
最後登入時間 :
2020-01-10 20:56:52
d492. 10226 - Hardwood species -- UVa10226 | From: [223.139.254.208] | 發表日期 : 2019-02-03 23:34

 

超時QAQ
希望能提供想法
下面還有2個問題


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
char input[10000][31]={'\0'};
double grade[10000]={1};
double total=0;
double min;
char test[31];
char ch;
int i,k,j,s,figure=0;
scanf("%d\n",&figure);


for(s=0;s<figure;s++)
{
for(i=0;i<10000;i++)
{
grade[i] = 1;
}
                                                     //問題1:
for(i=0;gets(input[i])!=0;i++)         //能不能gets(input[i]!=0) 或gets(input[i]!=NULL)取代EOF
{                                                   //網路上有人說可以有人說不行(快搞混了QAQ
for(j=0;j<i;j++)                             //問題2:
{                                                   //while(scanf("%[^\n]",input[i++])!=EOF)
if(strcmp(input[i],input[j])==0)       //有其他版本這樣寫(但不知道為何我都只能輸入1行
{                                                   //希望能說明是否相同,若相同希望能幫我理解為何我不能輸入第2行
grade[j] +=1;                                //P.S. scanf("%[^\n]\n",input[i++])嘗試過,但無法ctrl+z不能跑
i-=1;                                             //丟zero是錯誤的,但我無法debug,無從了解問題點
break;
}
}
}

for(j=i-1;j;j--)
{
for(k=0;k<j;k++)
{
if(strcmp(input[k],input[k+1])>0)
{
min = grade[k];
strcpy(test,input[k]);
grade[k] = grade[k+1];
strcpy(input[k],input[k+1]);
grade[k+1] = min;
strcpy(input[k+1],test);
}
}
}

for(j=0;j<i;j++)
{
total += grade[j];
}

for(j=0;j<i;j++)
{
printf("%s %.4f\n",input[j],(grade[j]/total)*100);
}

printf("\n");
total =0;
}
}

 
#16761: Re:超時


314159265358979323846264338327 ... (少年π)

學校 : 臺北市私立延平高級中學
編號 : 69058
來源 : [223.136.179.30]
最後登入時間 :
2024-04-29 19:11:35
d492. 10226 - Hardwood species -- UVa10226 | From: [42.73.45.52] | 發表日期 : 2019-02-05 21:00

 

超時QAQ
希望能提供想法
下面還有2個問題


#include
#include
#include

int main()
{
char input[10000][31]={'\0'};
double grade[10000]={1};
double total=0;
double min;
char test[31];
char ch;
int i,k,j,s,figure=0;
scanf("%d\n",&figure);


for(s=0;s<figure;s++)
{
for(i=0;i<10000;i++)
{
grade[i] = 1;
}
                                                     //問題1:
for(i=0;gets(input[i])!=0;i++)         //能不能gets(input[i]!=0) 或gets(input[i]!=NULL)取代EOF
{                                                   //網路上有人說可以有人說不行(快搞混了QAQ
for(j=0;j<i;j++)                             //問題2:
{                                                   //while(scanf("%[^\n]",input[i++])!=EOF)
if(strcmp(input[i],input[j])==0)       //有其他版本這樣寫(但不知道為何我都只能輸入1行
{                                                   //希望能說明是否相同,若相同希望能幫我理解為何我不能輸入第2行
grade[j] +=1;                                //P.S. scanf("%[^\n]\n",input[i++])嘗試過,但無法ctrl+z不能跑
i-=1;                                             //丟zero是錯誤的,但我無法debug,無從了解問題點
break;
}
}
}

for(j=i-1;j;j--)
{
for(k=0;k<j;k++)
{
if(strcmp(input[k],input[k+1])>0)
{
min = grade[k];
strcpy(test,input[k]);
grade[k] = grade[k+1];
strcpy(input[k],input[k+1]);
grade[k+1] = min;
strcpy(input[k+1],test);
}
}
}

for(j=0;j<i;j++)
{
total += grade[j];
}

for(j=0;j<i;j++)
{
printf("%s %.4f\n",input[j],(grade[j]/total)*100);
}

printf("\n");
total =0;
}
}

超時原因:判斷EOF問題
問題1:
A:

 

gets()!=NULL,scanf()!=EOF才能判斷EOF

不過您TLE的原因應該不是這個

gets()不太安全,緩衝區會爆炸(溢位),C11之後,gets()不為標準函式

可以用fgets()取代

問題2:

A:

while(scanf("%[^\n]",input[i++])!=EOF)

%[^\n]代表遇到換行才會中止

所以輸入一行後就回傳EOF了

也可用fgets取代

 

結論:

我覺得gets()不太安全,有可能是它的問題(我用它常常錯)

當然也有可能是其他問題

 
#16764: Re:超時


andy406031211@gmail.com (meow)

學校 : 不指定學校
編號 : 90635
來源 : [114.35.252.154]
最後登入時間 :
2020-01-10 20:56:52
d492. 10226 - Hardwood species -- UVa10226 | From: [42.77.100.19] | 發表日期 : 2019-02-05 21:22

 

超時QAQ
希望能提供想法
下面還有2個問題


#include
#include
#include

int main()
{
char input[10000][31]={'\0'};
double grade[10000]={1};
double total=0;
double min;
char test[31];
char ch;
int i,k,j,s,figure=0;
scanf("%d\n",&figure);


for(s=0;s<figure;s++)
{
for(i=0;i<10000;i++)
{
grade[i] = 1;
}
                                                     //問題1:
for(i=0;gets(input[i])!=0;i++)         //能不能gets(input[i]!=0) 或gets(input[i]!=NULL)取代EOF
{                                                   //網路上有人說可以有人說不行(快搞混了QAQ
for(j=0;j<i;j++)                             //問題2:
{                                                   //while(scanf("%[^\n]",input[i++])!=EOF)
if(strcmp(input[i],input[j])==0)       //有其他版本這樣寫(但不知道為何我都只能輸入1行
{                                                   //希望能說明是否相同,若相同希望能幫我理解為何我不能輸入第2行
grade[j] +=1;                                //P.S. scanf("%[^\n]\n",input[i++])嘗試過,但無法ctrl+z不能跑
i-=1;                                             //丟zero是錯誤的,但我無法debug,無從了解問題點
break;
}
}
}

for(j=i-1;j;j--)
{
for(k=0;k<j;k++)
{
if(strcmp(input[k],input[k+1])>0)
{
min = grade[k];
strcpy(test,input[k]);
grade[k] = grade[k+1];
strcpy(input[k],input[k+1]);
grade[k+1] = min;
strcpy(input[k+1],test);
}
}
}

for(j=0;j<i;j++)
{
total += grade[j];
}

for(j=0;j<i;j++)
{
printf("%s %.4f\n",input[j],(grade[j]/total)*100);
}

printf("\n");
total =0;
}
}

超時原因:判斷EOF問題
問題1:
A:

 

gets()!=NULL,scanf()!=EOF才能判斷EOF

不過您TLE的原因應該不是這個

gets()不太安全,緩衝區會爆炸(溢位),C11之後,gets()不為標準函式

可以用fgets()取代

問題2:

A:

while(scanf("%[^\n]",input[i++])!=EOF)

%[^\n]代表遇到換行才會中止

所以輸入一行後就回傳EOF了

也可用fgets取代

 

結論:

我覺得gets()不太安全,有可能是它的問題(我用它常常錯)

當然也有可能是其他

我先去看看fgets怎麼寫好了
沒學過QQ
gets()!=NULL(我最開始是用這個)
可是錯了我才試試看gets()!=0
那能確認我的想法會超時嗎?
還是問題指出在EOF判斷上?
我討厭gets的不穩QQ

 
#16771: Re:超時


314159265358979323846264338327 ... (少年π)

學校 : 臺北市私立延平高級中學
編號 : 69058
來源 : [223.136.179.30]
最後登入時間 :
2024-04-29 19:11:35
d492. 10226 - Hardwood species -- UVa10226 | From: [111.71.59.157] | 發表日期 : 2019-02-06 09:41

 

超時QAQ
希望能提供想法
下面還有2個問題


#include
#include
#include

int main()
{
char input[10000][31]={'\0'};
double grade[10000]={1};
double total=0;
double min;
char test[31];
char ch;
int i,k,j,s,figure=0;
scanf("%d\n",&figure);


for(s=0;s<figure;s++)
{
for(i=0;i<10000;i++)
{
grade[i] = 1;
}
                                                     //問題1:
for(i=0;gets(input[i])!=0;i++)         //能不能gets(input[i]!=0) 或gets(input[i]!=NULL)取代EOF
{                                                   //網路上有人說可以有人說不行(快搞混了QAQ
for(j=0;j<i;j++)                             //問題2:
{                                                   //while(scanf("%[^\n]",input[i++])!=EOF)
if(strcmp(input[i],input[j])==0)       //有其他版本這樣寫(但不知道為何我都只能輸入1行
{                                                   //希望能說明是否相同,若相同希望能幫我理解為何我不能輸入第2行
grade[j] +=1;                                //P.S. scanf("%[^\n]\n",input[i++])嘗試過,但無法ctrl+z不能跑
i-=1;                                             //丟zero是錯誤的,但我無法debug,無從了解問題點
break;
}
}
}

for(j=i-1;j;j--)
{
for(k=0;k<j;k++)
{
if(strcmp(input[k],input[k+1])>0)
{
min = grade[k];
strcpy(test,input[k]);
grade[k] = grade[k+1];
strcpy(input[k],input[k+1]);
grade[k+1] = min;
strcpy(input[k+1],test);
}
}
}

for(j=0;j<i;j++)
{
total += grade[j];
}

for(j=0;j<i;j++)
{
printf("%s %.4f\n",input[j],(grade[j]/total)*100);
}

printf("\n");
total =0;
}
}

超時原因:判斷EOF問題
問題1:
A:

 

gets()!=NULL,scanf()!=EOF才能判斷EOF

不過您TLE的原因應該不是這個

gets()不太安全,緩衝區會爆炸(溢位),C11之後,gets()不為標準函式

可以用fgets()取代

問題2:

A:

while(scanf("%[^\n]",input[i++])!=EOF)

%[^\n]代表遇到換行才會中止

所以輸入一行後就回傳EOF了

也可用fgets取代

 

結論:

我覺得gets()不太安全,有可能是它的問題(我用它常常錯)

當然也有可能是其他

我先去看看fgets怎麼寫好了
沒學過QQ
gets()!=NULL(我最開始是用這個)
可是錯了我才試試看gets()!=0
那能確認我的想法會超時嗎?
還是問題指出在EOF判斷上?
我討厭gets的不穩QQ

絕對是EOF
你的程式連測試執行都會TLE
這題測資不算多,將所有物種的數量記下來算比例即可。

2s,<10M對C的scanf綽綽有餘(我用C++寫(scanf,printf,getline)可以過(1S,1.1MB))

 
#16783: Re:超時


andy406031211@gmail.com (meow)

學校 : 不指定學校
編號 : 90635
來源 : [114.35.252.154]
最後登入時間 :
2020-01-10 20:56:52
d492. 10226 - Hardwood species -- UVa10226 | From: [42.77.248.183] | 發表日期 : 2019-02-06 23:08

 

超時QAQ
希望能提供想法
下面還有2個問題


#include
#include
#include

int main()
{
char input[10000][31]={'\0'};
double grade[10000]={1};
double total=0;
double min;
char test[31];
char ch;
int i,k,j,s,figure=0;
scanf("%d\n",&figure);


for(s=0;s<figure;s++)
{
for(i=0;i<10000;i++)
{
grade[i] = 1;
}
                                                     //問題1:
for(i=0;gets(input[i])!=0;i++)         //能不能gets(input[i]!=0) 或gets(input[i]!=NULL)取代EOF
{                                                   //網路上有人說可以有人說不行(快搞混了QAQ
for(j=0;j<i;j++)                             //問題2:
{                                                   //while(scanf("%[^\n]",input[i++])!=EOF)
if(strcmp(input[i],input[j])==0)       //有其他版本這樣寫(但不知道為何我都只能輸入1行
{                                                   //希望能說明是否相同,若相同希望能幫我理解為何我不能輸入第2行
grade[j] +=1;                                //P.S. scanf("%[^\n]\n",input[i++])嘗試過,但無法ctrl+z不能跑
i-=1;                                             //丟zero是錯誤的,但我無法debug,無從了解問題點
break;
}
}
}

for(j=i-1;j;j--)
{
for(k=0;k<j;k++)
{
if(strcmp(input[k],input[k+1])>0)
{
min = grade[k];
strcpy(test,input[k]);
grade[k] = grade[k+1];
strcpy(input[k],input[k+1]);
grade[k+1] = min;
strcpy(input[k+1],test);
}
}
}

for(j=0;j<i;j++)
{
total += grade[j];
}

for(j=0;j<i;j++)
{
printf("%s %.4f\n",input[j],(grade[j]/total)*100);
}

printf("\n");
total =0;
}
}

超時原因:判斷EOF問題
問題1:
A:

 

gets()!=NULL,scanf()!=EOF才能判斷EOF

不過您TLE的原因應該不是這個

gets()不太安全,緩衝區會爆炸(溢位),C11之後,gets()不為標準函式

可以用fgets()取代

問題2:

A:

while(scanf("%[^\n]",input[i++])!=EOF)

%[^\n]代表遇到換行才會中止

所以輸入一行後就回傳EOF了

也可用fgets取代

 

結論:

我覺得gets()不太安全,有可能是它的問題(我用它常常錯)

當然也有可能是其他

我先去看看fgets怎麼寫好了
沒學過QQ
gets()!=NULL(我最開始是用這個)
可是錯了我才試試看gets()!=0
那能確認我的想法會超時嗎?
還是問題指出在EOF判斷上?
我討厭gets的不穩QQ

絕對是EOF
你的程式連測試執行都會TLE
這題測資不算多,將所有物種的數量記下來算比例即可。

2s,<10M對C的scanf綽綽有餘(我用C++寫(scanf,printf,getline)可以過(1S,1.1MB))

 

 

for(i=0;fgets(input[i],31,stdin)!=NULL;i++)

{

int num = strlen(input[i]);

input[i][num-1] = '\0';          //把\n換成\0

for(j=0 ; j<i ; j++)

{

if(strcmp(input[i],input[j])==0)

{

grade[j]++;

i--;

break;

}

}

}

那fgets該怎麼寫,或是哪裡有看懂fgets的資源
(我書上找不到fgets)
查網路,我目前寫的是上面這樣
但依然TLE

 

 
#16791: Re:超時


314159265358979323846264338327 ... (少年π)

學校 : 臺北市私立延平高級中學
編號 : 69058
來源 : [223.136.179.30]
最後登入時間 :
2024-04-29 19:11:35
d492. 10226 - Hardwood species -- UVa10226 | From: [223.136.46.9] | 發表日期 : 2019-02-07 17:38

 

超時QAQ
希望能提供想法
下面還有2個問題


#include
#include
#include

int main()
{
char input[10000][31]={'\0'};
double grade[10000]={1};
double total=0;
double min;
char test[31];
char ch;
int i,k,j,s,figure=0;
scanf("%d\n",&figure);


for(s=0;s<figure;s++)
{
for(i=0;i<10000;i++)
{
grade[i] = 1;
}
                                                     //問題1:
for(i=0;gets(input[i])!=0;i++)         //能不能gets(input[i]!=0) 或gets(input[i]!=NULL)取代EOF
{                                                   //網路上有人說可以有人說不行(快搞混了QAQ
for(j=0;j<i;j++)                             //問題2:
{                                                   //while(scanf("%[^\n]",input[i++])!=EOF)
if(strcmp(input[i],input[j])==0)       //有其他版本這樣寫(但不知道為何我都只能輸入1行
{                                                   //希望能說明是否相同,若相同希望能幫我理解為何我不能輸入第2行
grade[j] +=1;                                //P.S. scanf("%[^\n]\n",input[i++])嘗試過,但無法ctrl+z不能跑
i-=1;                                             //丟zero是錯誤的,但我無法debug,無從了解問題點
break;
}
}
}

for(j=i-1;j;j--)
{
for(k=0;k<j;k++)
{
if(strcmp(input[k],input[k+1])>0)
{
min = grade[k];
strcpy(test,input[k]);
grade[k] = grade[k+1];
strcpy(input[k],input[k+1]);
grade[k+1] = min;
strcpy(input[k+1],test);
}
}
}

for(j=0;j<i;j++)
{
total += grade[j];
}

for(j=0;j<i;j++)
{
printf("%s %.4f\n",input[j],(grade[j]/total)*100);
}

printf("\n");
total =0;
}
}

超時原因:判斷EOF問題
問題1:
A:

 

gets()!=NULL,scanf()!=EOF才能判斷EOF

不過您TLE的原因應該不是這個

gets()不太安全,緩衝區會爆炸(溢位),C11之後,gets()不為標準函式

可以用fgets()取代

問題2:

A:

while(scanf("%[^\n]",input[i++])!=EOF)

%[^\n]代表遇到換行才會中止

所以輸入一行後就回傳EOF了

也可用fgets取代

 

結論:

我覺得gets()不太安全,有可能是它的問題(我用它常常錯)

當然也有可能是其他

我先去看看fgets怎麼寫好了
沒學過QQ
gets()!=NULL(我最開始是用這個)
可是錯了我才試試看gets()!=0
那能確認我的想法會超時嗎?
還是問題指出在EOF判斷上?
我討厭gets的不穩QQ

絕對是EOF
你的程式連測試執行都會TLE
這題測資不算多,將所有物種的數量記下來算比例即可。

2s,<10M對C的scanf綽綽有餘(我用C++寫(scanf,printf,getline)可以過(1S,1.1MB))

 

 

for(i=0;fgets(input[i],31,stdin)!=NULL;i++)

{

int num = strlen(input[i]);

input[i][num-1] = '\0';          //把\n換成\0

for(j=0 ; j

{

if(strcmp(input[i],input[j])==0)

{

grade[j]++;

i--;

break;

}

}

}

那fgets該怎麼寫,或是哪裡有看懂fgets的資源
(我書上找不到fgets)
查網路,我目前寫的是上面這樣
但依然TLE

 

你寫的fgets是對的
所以可能不是這個問題

可是每組測資是以一空白行結尾,空白行=EOF

判斷空白行,我用getline這樣寫,相信fgets也有類似的寫法:

while( getline(cin, input) && input != "" )
 
ZeroJudge Forum