#66: 問題


sa411022 (sa411022)

學校 : 國立臺中第二高級中學
編號 : 1027
來源 : [140.113.93.37]
最後登入時間 :
2010-04-05 21:52:41
b072. D. 打不倒的空氣人 -- 2007 NPSC 高中組初賽 | From: [61.66.76.57] | 發表日期 : 2007-12-10 22:48

這題測資應該有問題

連丟NPSC公佈的解答都會錯= =

 
#67: Re:問題


debugger (殺蟲劑)

學校 : 不指定學校
編號 : 1
來源 : [163.32.93.124]
最後登入時間 :
2023-10-31 17:39:44
b072. D. 打不倒的空氣人 -- 2007 NPSC 高中組初賽 | From: [163.32.93.88] | 發表日期 : 2007-12-11 11:32

 

經過檢查,發現是題目的 記憶體限制 (memorylimit: 10000KBytes) 限制了 string 的長度

因此導致 RE。 

為了因應 NPSC 常有的這種大量測資,因此所有題目的記憶體限制全面放寬為 50 MBytes

如果以前有一些題目覺得 RE 的莫名其妙,可以去重測看看(按 RE 旁的 即可),說不定就過了。

感謝 sa411022  提出這個問題 

 

 

 
#68: Re:問題


debugger (殺蟲劑)

學校 : 不指定學校
編號 : 1
來源 : [163.32.93.124]
最後登入時間 :
2023-10-31 17:39:44
b072. D. 打不倒的空氣人 -- 2007 NPSC 高中組初賽 | From: [163.32.93.88] | 發表日期 : 2007-12-11 11:41

 

補充: RE 的訊息為 SIGABRT 的才可能是這個問題哦

 

 
#69: Re:問題


sa411022 (sa411022)

學校 : 國立臺中第二高級中學
編號 : 1027
來源 : [140.113.93.37]
最後登入時間 :
2010-04-05 21:52:41
b072. D. 打不倒的空氣人 -- 2007 NPSC 高中組初賽 | From: [61.66.76.57] | 發表日期 : 2007-12-11 21:08

一個奇怪的問題

這是NPSC公佈的code:

#include<iostream>
#include<string>

using namespace std;

int main() {
 int n, m;
 while(cin >> n >> m, n) {
  string s, t;
  while(n--) {
   cin >> t;
   s += t;
  }

  int x;
  while(m--) {
   cin >> x;
   cout << s[x-1] ;
  }
  cout << endl;
 }
}

 這是我寫的code:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int n, m;
    while(cin >> n >> m, n)
    {

        string tmp, str;
        while(n--)
            cin >> tmp, str = str + tmp;
        int num;
        while(m--)
            cin >> num, cout << str[num - 1];
        cout << endl;
    }
}

 

明明一模一樣

上面的AC 下面的TLE

不知是何故?

 
#70: Re:問題


debugger (殺蟲劑)

學校 : 不指定學校
編號 : 1
來源 : [163.32.93.124]
最後登入時間 :
2023-10-31 17:39:44
b072. D. 打不倒的空氣人 -- 2007 NPSC 高中組初賽 | From: [163.32.93.88] | 發表日期 : 2007-12-12 09:37

因為這個 operator + 是一個很沒有效率的運算子

它另外產生了一個兩倍長度的字串,然後把第一個字串 copy 進去 再接上 第二個字串

所以效率不好

一般程式少量使用時應該是沒有太大差別,但是比賽題目就是想要測你這一個點 

所以還是得改成用  str = str.append(tmp); 就不會老是重頭 copy 了

這點字串處理跟 JAVA 很像,JAVA 則改用 StringBuffer.append() 來處理字串串接

NPSC 的參考解答 operator += 也是做了 append 的事所以速度過得去

 

 

 
#71: Re:問題


bmw530li (bmw530li)

學校 : 國立鳳新高級中學
編號 : 1085
來源 : [140.117.182.47]
最後登入時間 :
2009-11-02 17:30:42
b072. D. 打不倒的空氣人 -- 2007 NPSC 高中組初賽 | From: [210.60.161.254] | 發表日期 : 2007-12-12 16:10

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

int main(){
    do{
        char in[25][25]={"\0"},ans[50]={"\0"};
        int n,m,a[25]={0};
        register int i;
        scanf("%d",&n);
        scanf("%d",&m);
        if(n==0&&m==0) break;
        for(i=0;i<n;i++){
            scanf("%s",in[i]);
            strcat(ans,in[i]);
        }
        for(i=0;i<m;i++)
            scanf("%d",&a[i]);

        for(i=0;i<m;i++)
            printf("%c",ans[a[i]-1]);
           
 
       }while(1);
    return 0;
}

 

  這是我的code 我也會一直RE

不知道哪邊有錯了...

 可以幫我看看媽?

 
#72: Re:問題


sa411022 (sa411022)

學校 : 國立臺中第二高級中學
編號 : 1027
來源 : [140.113.93.37]
最後登入時間 :
2010-04-05 21:52:41
b072. D. 打不倒的空氣人 -- 2007 NPSC 高中組初賽 | From: [61.66.76.57] | 發表日期 : 2007-12-12 20:11

所以admin大大您的意思是說

a += b; 會比 a = a + b; 快囉?

 
#73: Re:問題


debugger (殺蟲劑)

學校 : 不指定學校
編號 : 1
來源 : [163.32.93.124]
最後登入時間 :
2023-10-31 17:39:44
b072. D. 打不倒的空氣人 -- 2007 NPSC 高中組初賽 | From: [163.32.93.88] | 發表日期 : 2007-12-13 16:27

是啊, += 比較快

 

 
#80: Re:問題


s864372002 (建資98級鋼琴)

學校 : 新北市立安溪國中
編號 : 1018
來源 : [163.20.242.100]
最後登入時間 :
2015-05-30 11:06:43
b072. D. 打不倒的空氣人 -- 2007 NPSC 高中組初賽 | From: [210.71.78.242] | 發表日期 : 2007-12-21 11:28

回樓上上上:這是高中組的,n最大到1000000,m最大到100

//感覺國中組的好簡單,連strcat都會過......

 
#130: Re:問題


su_horng (su_horng)

學校 : 劍橋大學國王學院
編號 : 1089
來源 : [111.248.42.147]
最後登入時間 :
2014-12-13 21:15:21
b072. D. 打不倒的空氣人 -- 2007 NPSC 高中組初賽 | From: [61.230.0.185] | 發表日期 : 2008-01-26 19:25

但是+=會比=快只限於某些情況吧

程式語言內建的型態如int, long, 等等的,應該就不會比較快?

應該是重載運算子的差異?

對於string來說, 

是不是因為operator+可能是c=a+b的情況,

所以才產生2倍長的字串,而比較慢, 

 
#134: Re:問題


debugger (殺蟲劑)

學校 : 不指定學校
編號 : 1
來源 : [163.32.93.124]
最後登入時間 :
2023-10-31 17:39:44
b072. D. 打不倒的空氣人 -- 2007 NPSC 高中組初賽 | From: [163.32.93.88] | 發表日期 : 2008-01-27 10:36

但是+=會比=快只限於某些情況吧

程式語言內建的型態如int, long, 等等的,應該就不會比較快?

應該是重載運算子的差異?

對於string來說, 

是不是因為operator+可能是c=a+b的情況,

所以才產生2倍長的字串,而比較慢, 


你說得沒有錯,對於基本資料形態來說沒有差別

但對於 ”物件“ 來說,通常 += 會比 + 有效率

因為 + 必須處理更一般化運算,且通常都要產生新物件以便指定給 =號 左邊的變數,會額外消耗一個暫時物件的建構、解構的成本

而 += 因為已經知道要賦值的對象就是自己,因此不需再建立新物件

 

 
ZeroJudge Forum