HW 10
Problem A: 可变长数组
main函数:
int main() { int cases, num, iData; double dData; DataVector<int> iVector; DataVector<double> dVector; char type; cin>>cases; for (int i = 0; i < cases; i++) { cin>>type; switch(type) { case 'i': iVector.clearVector(); cin>>num; for (int j = 0; j < num; j++) { cin>>iData; iVector.getVector().push_back(iData); } iVector.show(); cout<<iVector.getSum()<<endl; break; case 'd': dVector.clearVector(); cin>>num; for (int j = 0; j < num; j++) { cin>>dData; dVector.getVector().push_back(dData); } dVector.show(); cout<<setprecision(2)<<fixed<<dVector.getSum()<<endl; } } return 0; }
考点:类模板 vector
AC代码:
#include <bits/stdc++.h> using namespace std; template <class T> class DataVector { vector<T>members; public: void show() { int len = members.size(); for(int i = 0;i<len;i++) { cout << members[i] << (i==len-1?'\n':' '); } } T getSum() { double d = 0; int len =members.size(); for(int i = 0;i<len;i++) d+=members[i]; return d; } void clearVector() { members.clear(); } vector<T>&getVector() { return members; } };
Problem B: 求平均年龄
main函数:
int main() { int cases, age; string name; Persons persons; cin>>cases; for (int i = 0; i < cases; i++) { cin>>name>>age; persons.addAPerson(name, age); } cout<<setprecision(2)<<fixed<<persons.getAveAge()<<endl; }
考点:静态数据成员
#include <bits/stdc++.h> using namespace std; class Persons { string name; int age; static int m, n; public: Persons(){} //Person(string _s,int _age):name(_s),age(_age){} void addAPerson(string s,int a) { m++; name =s; age =a; n+=a; } static double getAveAge() { return (double)n/m; } }; int Persons::m = 0; int Persons::n = 0;
Problem C: 合唱比赛开始了!
main函数:
int main() { Contest contest; contest.Input(); contest.Compute(); contest.Sort(); contest.Show(); return 0; }
考点:输入输出处理,sort函数(类内重载用sort的话要在最后加const)
(主函数好评,然而CE到RE😭)
AC代码:
#include <bits/stdc++.h> using namespace std; struct Team { string name; //vector<double> v; double score; }; bool cmp(const Team &a,const Team &b) { return a.score>b.score; } class Contest { int m,n,p; vector<Team> t; public: void Input() { cin >> m >> n >> p; Team o; for(int i = 0;i<m;i++) t.push_back(o); for(int k = 0; k<m; k++) { cin >> t[k].name; double v[1000]; for(int i = 0; i<n; i++) { double c = 0; for(int j = 0; j<p; j++) { int b; cin >> b; c+=b; } v[i] = c/p; } sort(v,v+n); double c = 0; for(int j = 1; j<n-1; j++) c+=v[j]; t[k].score = c/(n-2); } } void Compute() { } void Sort() { sort(t.begin(),t.end(),cmp); } void Show() { for(int i = 0; i<m; i++) { cout << left << setw(11) << t[i].name << setprecision(2) << fixed << t[i].score << endl; } } };
Problem D: 字符构成的图形
main函数:
int main() { int cases, n; char c; cin>>cases; for (int i = 0; i < cases; i++) { cin>>n>>c; CharGraph cGraph(n, c); cGraph.print(); } return 0; }
考点:类的使用
AC代码:
#include <bits/stdc++.h> using namespace std; class CharGraph { int step; char c; public: CharGraph(int _step,char _c):step(_step),c(_c){} void print() { // cout << step << endl; if(step == 0) printf("\n"); else if(step>0) { for(int i = 1;i<=step;i++) { for(int j = 1;j<=i;j++) printf("%c",c); printf("\n"); } } else { step = abs(step); for(int i = 1;i<=step;i++) { for(int j = step;j>=i;j--) printf("%c",c); printf("\n"); } } } };
Problem E: 分数类的模板数组类
main函数:
int main() { int n; cin >> n; Array<double> db(1000); db.input(n); double dbsum(0.0); for(int i = 0; i < n; i++) dbsum += db[i]; cout << dbsum << endl; cin >> n; Array<Fract> fr(1000); fr.input(n); Fract frsum(0, 1); for(int i = 0; i < n; i++) frsum += fr[i]; frsum.show(); }
考点:输入输出重载,分数类的处理。
AC代码:
#include <bits/stdc++.h> using namespace std; template <class T> class Array { int n; vector<T> v; public: Array(int _n) { n = _n,v = vector<T>(n); } void input(int m) { int len = m<n?m:n; for(int i = 0; i<len; i++) cin >> v[i]; int d; for(int i = len; i<m; i++) cin >> d; } T operator [](int x) { return v[x]; } }; class Fract { int a,b; bool flag; public: Fract(){} Fract(int _a,int _b) { if(_a*_b>0) flag = true; else flag = false; a = abs(_a); b = abs(_b); int d = __gcd(a,b); a/=d,b/=d; } void show() { if(a==0) cout << 0 << endl; else { if(!flag) cout << "-"; if(b==1) cout << a << endl; else { cout << a << "/" << b << endl; } } } Fract& operator +=(const Fract &f) { int d = b*f.b/__gcd(b,f.b); int d1 = d/b; int d2 = d/f.b; a*=d1; int b1 = f.b,a1 = f.a; a1=a1*d2; b = d; if(!flag) a=-a; if(!f.flag) a1=-a1; a+=a1; *this = Fract(a,b); return *this; } friend istream& operator >>(istream &is,Fract &f) { int a ,b; is >> a >> b; f = Fract(a,b); return is; } };
Problem F: 开个餐馆算算账
考点:map,sort的使用,要注意排序时要用字典序(WA6次)
AC代码:
#include <bits/stdc++.h> using namespace std; struct customer { string name; double cost; int len; public: customer(){}; customer(string _name,double _cost):name(_name),cost(_cost){len =name.size();} }d[10000]; bool cmp(const customer &a,const customer &b) { return a.name<b.name; }
过往不恋 未来不迎 当下不负