PAT乙級-1061. 判斷題(15)
阿新 • • 發佈:2019-01-05
1.可以的答案
#include <iostream>
#include <vector>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv) {
int n=0;// 學生數量
int m=0;// 題的數量
vector<int> question_scores_vect;
vector <int> right_answers_vect;
cin>>n>>m;
for(int i=0;i<m;i++){
int score = 0 ;
cin>>score;
question_scores_vect.push_back(score);
}
for(int j=0;j<m;j++){
int answer = 0 ;
cin>>answer;
right_answers_vect.push_back(answer);
}
// 依次讀取學生答卷,讀到就判,馬上輸出。
while(n--){//對於每一個學生
vector<int> students_answers;
int student_score = 0;
for(int k=0;k<m;k++){
// 每一個問題
int s_answer=0;
cin>>s_answer;
if(s_answer==right_answers_vect[k]){
student_score+=question_scores_vect[k];
}
}
cout <<student_score<<endl;
}
return 0;
}
2.思考改進
本題目在解題時,使用了vector,但是並沒有使用迭代器的東西,所以感覺有點多餘。應該使用動態陣列的方式來解題,故本題應為如下程式碼:
#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv) {
int n=0;// 學生數量
int m=0;// 題的數量
cin>>n>>m;
int* question_scores_vect = new int[m];// 問題分數陣列
int* right_answers_vect = new int[m];// 正確答案陣列
// 初始化問題分數陣列
for(int i=0;i<m;i++){
cin>>question_scores_vect[i];
}
// 初始化正確答案陣列
for(int j=0;j<m;j++){
cin>>right_answers_vect[j];
}
// 依次讀取學生答卷,讀到就判,馬上輸出。
while(n--){//對於每一個學生
int student_score = 0;// 該生獲得成績
for(int k=0;k<m;k++){
// 每一個問題
int s_answer=0;
cin>>s_answer;
if(s_answer==right_answers_vect[k]){
student_score+=question_scores_vect[k];
}
}
cout<<student_score<<endl;
}
delete[] question_scores_vect;
delete[] right_answers_vect;
question_scores_vect=NULL;
right_answers_vect=NULL;
return 0;
}
3.Tips
需要注意的是,很多語句需要像寫雙引號,左括號右括號那樣成對出現的。比如寫申請動態陣列,申請和釋放要成對寫,寫完了這個再把游標移到中間繼續填寫裡面的內容。這個在之後的程式設計學習中也要格外注意。如果你在學習C++的時候就養成了申請必釋放的好習慣,那麼在你寫Java、JS、Python的io操作的時候就會較少出現資源佔用的問題。我認為,演算法題目並不是在比拼智力,而是通過一個非常抽象的極簡環境來教育我們在程式設計中需要注意到的問題。希望大家程式設計順利,沒有bug。