#11716: tell me why plz~~


HSUxMichael (IAmTotallyExhausted)

學校 : 臺北市立成功高級中學
編號 : 61983
來源 : [101.10.132.127]
最後登入時間 :
2020-10-11 12:31:31
c094. 00661 - Blowing Fuses -- UVa661 | From: [180.217.162.99] | 發表日期 : 2017-02-07 01:35

第 1 測資點(100%): RE (SIGSEGV)
執行時期錯誤

記憶體區段錯誤!

//求解!!為啥總是RE

//我自己測試及ZJ的測試都是OK的

//可是丟上來就....

//以下是我的程式

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
int n,m,c,i,time=1;
while(cin>>n>>m>>c){
if(n+m+c==0){
break;
}
int a[n],o[n],s,sum=0,big[m];
for(i=0;i<n;i++){
cin>>a[i];
o[i]=0;
}
for(i=0;i<m;i++){
cin>>s;
o[s-1]=!o[s-1];
if(o[s-1]==1){
sum=sum+a[s-1];
}
else if(o[s-1]==0){
sum=sum-a[s-1];
}
big[i]=sum;
if(sum>=c){
break;
}
}
cout<<"Sequence "<<time<<'\n';
time++;
if(sum<c){
sort(big,big+m);
cout<<"Fuse was not blown.\n";
cout<<"Maximal power consumption was "<<big[m-1]<<" amperes.\n";
}
else if(sum>=c){
cout<<"Fuse was blown.\n";
}
cout<<'\n';
}
return 0;
}

 

 
#11717: Re:tell me why plz~~


tenghaooo (所以掰掰了 仙杜瑞拉)

學校 : 國立東華大學
編號 : 63056
來源 : [1.34.145.23]
最後登入時間 :
2020-04-21 23:59:18
c094. 00661 - Blowing Fuses -- UVa661 | From: [114.42.101.33] | 發表日期 : 2017-02-07 03:51

第 1 測資點(100%): RE (SIGSEGV)
執行時期錯誤

記憶體區段錯誤!

//求解!!為啥總是RE

//我自己測試及ZJ的測試都是OK的

//可是丟上來就....

//以下是我的程式.......吃光光

 

 

當你的 sum > c 的時候,不能提早break,因為輸入還是會繼續餵,你要讓他餵完m次才行

你提早 break 的話,剩下的輸入會被當成下一 round 的資料,就錯了

另外當sum == c 的時候,還是合法的,因為並沒有「超過」保險絲承受範圍

 

簡單來說,就把你的big填滿再sort就對

然後看big中最大的那個值有沒有超過c

 

以下是我稍微改的,盡量保留你本來的代碼 ^ ^

#include <iostream>

#include <algorithm>

using namespace std;

 

int main() {

    int n, m, c, i, time = 1;

    while (cin >> n >> m >> c) {

        if (n + m + c == 0) {

            break;

        }

        int a[n], o[n], s, sum=0, big[m];

        for (i = 0; i < n; i++) {

            cin >> a[i];

            o[i] = 0;

        }

        for (i = 0; i < m; i++) {

            cin >> s;

            o[s-1] = !o[s-1];

            if (o[s-1] == 1) {

                sum = sum + a[s-1];

            }

            else if (o[s-1] == 0) {

                sum = sum - a[s-1];

            }

            big[i] = sum;

        }

        cout << "Sequence " << time << '\n';

        time++;

        sort(big,big+m);

        int max = big[m - 1];

        if (max <= c) {

            cout << "Fuse was not blown.\n";

            cout << "Maximal power consumption was " << max << " amperes.\n";

        }

        else if (sum > c) {

            cout << "Fuse was blown.\n";

        }

        cout << '\n';

    }

    return 0;

}

 

 

 

 

 
#11718: Re:tell me why plz~~


tenghaooo (所以掰掰了 仙杜瑞拉)

學校 : 國立東華大學
編號 : 63056
來源 : [1.34.145.23]
最後登入時間 :
2020-04-21 23:59:18
c094. 00661 - Blowing Fuses -- UVa661 | From: [114.42.101.33] | 發表日期 : 2017-02-07 03:55

第 1 測資點(100%): RE (SIGSEGV)
執行時期錯誤

記憶體區段錯誤!

//求解!!為啥總是RE

//我自己測試及ZJ的測試都是OK的

//可是丟上來就....

//以下是我的程式.......吃光光

 

 

當你的 sum > c 的時候,不能提早break,因為輸入還是會繼續餵,你要讓他餵完m次才行

你提早 break 的話,剩下的輸入會被當成下一 round 的資料,就錯了

另外當sum == c 的時候,還是合法的,因為並沒有「超過」保險絲承受範圍

 

簡單來說,就把你的big填滿再sort就對

然後看big中最大的那個值有沒有超過c

 

以下是我稍微改的,盡量保留你本來的代碼 ^ ^

#include <iostream>

#include <algorithm>

using namespace std;

 

int main() {

    int n, m, c, i, time = 1;

    while (cin >> n >> m >> c) {

        if (n + m + c == 0) {

            break;

        }

        int a[n], o[n], s, sum=0, big[m];

        for (i = 0; i < n; i++) {

            cin >> a[i];

            o[i] = 0;

        }

        for (i = 0; i < m; i++) {

            cin >> s;

            o[s-1] = !o[s-1];

            if (o[s-1] == 1) {

                sum = sum + a[s-1];

            }

            else if (o[s-1] == 0) {

                sum = sum - a[s-1];

            }

            big[i] = sum;

        }

        cout << "Sequence " << time << '\n';

        time++;

        sort(big,big+m);

        int max = big[m - 1];

        if (max <= c) {

            cout << "Fuse was not blown.\n";

            cout << "Maximal power consumption was " << max << " amperes.\n";

        }

        else if (max > c) {

            cout << "Fuse was blown.\n";

        }

        cout << '\n';

    }

    return 0;

}

 

 

 

 




 
#11719: Re:tell me why plz~~


HSUxMichael (IAmTotallyExhausted)

學校 : 臺北市立成功高級中學
編號 : 61983
來源 : [101.10.132.127]
最後登入時間 :
2020-10-11 12:31:31
c094. 00661 - Blowing Fuses -- UVa661 | From: [180.217.155.200] | 發表日期 : 2017-02-07 11:03

第 1 測資點(100%): RE (SIGSEGV)
執行時期錯誤

記憶體區段錯誤!

//求解!!為啥總是RE

//我自己測試及ZJ的測試都是OK的

//可是丟上來就....

//以下是我的程式.......吃光光

 

 

當你的 sum > c 的時候,不能提早break,因為輸入還是會繼續餵,你要讓他餵完m次才行

你提早 break 的話,剩下的輸入會被當成下一 round 的資料,就錯了

另外當sum == c 的時候,還是合法的,因為並沒有「超過」保險絲承受範圍

 

簡單來說,就把你的big填滿再sort就對

然後看big中最大的那個值有沒有超過c

 

以下是我稍微改的,盡量保留你本來的代碼 ^ ^

#include

#include

using namespace std;

 

int main() {

    int n, m, c, i, time = 1;

    while (cin >> n >> m >> c) {

        if (n + m + c == 0) {

            break;

        }

        int a[n], o[n], s, sum=0, big[m];

        for (i = 0; i < n; i++) {

            cin >> a[i];

            o[i] = 0;

        }

        for (i = 0; i < m; i++) {

            cin >> s;

            o[s-1] = !o[s-1];

            if (o[s-1] == 1) {

                sum = sum + a[s-1];

            }

            else if (o[s-1] == 0) {

                sum = sum - a[s-1];

            }

            big[i] = sum;

        }

        cout << "Sequence " << time << '\n';

        time++;

        sort(big,big+m);

        int max = big[m - 1];

        if (max <= c) {

            cout << "Fuse was not blown.\n";

            cout << "Maximal power consumption was " << max << " amperes.\n";

        }

        else if (max > c) {

            cout << "Fuse was blown.\n";

        }

        cout << '\n';

    }

    return 0;

}

 

 

 

 

感謝指教^_^!!




 
ZeroJudge Forum