#5771: 我懷疑這題測資有錯


alextsui19 (最愛C++)

學校 : 香港專業教育學院 (IVE)
編號 : 19874
來源 : [218.188.39.83, 210.3.39.90]
最後登入時間 :
2014-08-07 15:28:04
a218. 連猴子都會的小case | From: [119.236.114.218] | 發表日期 : 2011-09-05 00:04

我試了N次了

都不知道為什麼錯在line 1

這是我的測資

6

3 3 4 5 6 1

3 1 4 5 6

1 1 2 2 3 3 4 4

1 2 3 4

3

1 2 2

2 1

5

0 0 0 0 9

0 9

完全不知道為何錯在line 1大哭

程式碼如下:

#include<iostream>
using namespace std;
int main(){
    int len;
    while(cin >> len){
        int n[10]={0},num,count = 0;
        for(int i = 0;i < len;i++){
            cin >> num;
            n[num]++;
        }
        for(int j = 0;j < 10;j++){
            if(n[j] > 0){
                count++;   
            }
        }
        int a[count],loc = 0;
        for(int j = 0;j < 10;j++){
            if(n[j] > 0){
                a[loc] = n[j];
                loc++;   
            }
        }
        int temp;
        for(int j = 0;j < count;j++){
            for(int k = 0;k < count - 1;k++){
                if(a[k] >= a[k+1]){
                    temp = a[k];
                    a[k] = a[k+1];
                    a[k+1] = temp;   
                }
            }
        }
        for(int i = count - 1; i >= 0;){
            for(int j = 0; j < 10;j++){
                if(a[i] == n[j]){
                    cout << j << " ";
                    if(i - 1 >= 0){
                        if(a[i - 1] != a[i]){
                            i--;
                            break;
                        }
                    }
                    i--;
                }
            }
        }
        cout << endl;
    }   
}

 
#5772: Re:我懷疑這題測資有錯


alextsui19 (最愛C++)

學校 : 香港專業教育學院 (IVE)
編號 : 19874
來源 : [218.188.39.83, 210.3.39.90]
最後登入時間 :
2014-08-07 15:28:04
a218. 連猴子都會的小case | From: [119.236.114.218] | 發表日期 : 2011-09-05 00:25

我試了N次了

都不知道為什麼錯在line 1

這是我的測資

6

3 3 4 5 6 1

3 1 4 5 6

1 1 2 2 3 3 4 4

1 2 3 4

3

1 2 2

2 1

5

0 0 0 0 9

0 9

完全不知道為何錯在line 1大哭

程式碼如下:

#include
using namespace std;
int main(){
    int len;
    while(cin >> len){
        int n[10]={0},num,count = 0;
        for(int i = 0;i < len;i++){
            cin >> num;
            n[num]++;
        }
        for(int j = 0;j < 10;j++){
            if(n[j] > 0){
                count++;   
            }
        }
        int a[count],loc = 0;
        for(int j = 0;j < 10;j++){
            if(n[j] > 0){
                a[loc] = n[j];
                loc++;   
            }
        }
        int temp;
        for(int j = 0;j < count;j++){
            for(int k = 0;k < count - 1;k++){
                if(a[k] >= a[k+1]){
                    temp = a[k];
                    a[k] = a[k+1];
                    a[k+1] = temp;   
                }
            }
        }
        for(int i = count - 1; i >= 0;){
            for(int j = 0; j < 10;j++){
                if(a[i] == n[j]){
                    cout << j << " ";
                    if(i - 1 >= 0){
                        if(a[i - 1] != a[i]){
                            i--;
                            break;
                        }
                    }
                    i--;
                }
            }
        }
        cout << endl;
    }   
}

連最基本的測資我都試過了

和答案完全一樣,

但錯在Line 1竟然多了個6,可怕衰死了~~

 
#5773: Re:我懷疑這題測資有錯


longbiau ((~o ̄▽ ̄)o Summer)

學校 : 臺北市立中正高級中學
編號 : 8414
來源 : [203.64.138.253]
最後登入時間 :
2013-02-27 15:34:10
a218. 連猴子都會的小case | From: [61.231.71.62] | 發表日期 : 2011-09-05 17:41

測資無誤。

for(int i = count - 1; i >= 0;){
  for(int j = 0; j < 10;j++){
    if(a[i] == n[j]){
      cout << j << " ";
      if(i - 1 >= 0){
        if(a[i - 1] != a[i]){
          i--;
          break;
        }
      }
      i--; //如果這裡i--之後,i<0會發生什麼事?
      }
    }
  } 

a[-1]依然可以取值(只是用負數當索引值是相當危險的),這個值不在掌控之中,而又拿來和n[j]比較,因此神奇的事情就發生了。微笑

題外話: 
int a[count]; 的寫法換成 int *a=(int *)malloc(sizeof(int)*count); 會好些,因為用可變的變數來當作陣列宣告時的大小並不是標準的語法。
如果是使用Dev-C++撰寫,工具->編譯器選項->呼叫編譯器加入下列的命令中輸入:-ansi -pedantic –W -Wall並且打勾,這樣就會抓出非標準的語法錯誤了。

 
#5774: Re:我懷疑這題測資有錯


alextsui19 (最愛C++)

學校 : 香港專業教育學院 (IVE)
編號 : 19874
來源 : [218.188.39.83, 210.3.39.90]
最後登入時間 :
2014-08-07 15:28:04
a218. 連猴子都會的小case | From: [119.237.168.87] | 發表日期 : 2011-09-05 19:20

測資無誤。

for(int i = count - 1; i >= 0;){
  for(int j = 0; j < 10;j++){
    if(a[i] == n[j]){
      cout << j << " ";
      if(i - 1 >= 0){
        if(a[i - 1] != a[i]){
          i--;
          break;
        }
      }
      i--; //如果這裡i--之後,i<0會發生什麼事?
      }
    }
  } 

a[-1]依然可以取值(只是用負數當索引值是相當危險的),這個值不在掌控之中,而又拿來和n[j]比較,因此神奇的事情就發生了。微笑

題外話: 
int a[count]; 的寫法換成 int *a=(int *)malloc(sizeof(int)*count); 會好些,因為用可變的變數來當作陣列宣告時的大小並不是標準的語法。
如果是使用Dev-C++撰寫,工具->編譯器選項->呼叫編譯器加入下列的命令中輸入:-ansi -pedantic –W -Wall並且打勾,這樣就會抓出非標準的語法錯誤了。

謝謝解答太可笑嘍


 
ZeroJudge Forum