Re: [问题] ITSA第24次第4题

楼主: ACMANIAC (請肥宅救救肥宅)   2014-05-05 04:59:30
关于排序,这样写可能会更省时省力,尤其在程式竞赛。
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
struct MVP {
string name;
int salary, people;
MVP(const string &name, const int &salary, const int &people) {
this->name = name;
this->salary = salary;
this->people = people;
}
bool operator < (const MVP &m) const
{
return this->salary > m.salary ||
this->salary == m.salary && this->people > m.people;
}
};
int main()
{
string name;
int N, S, P;
cin >> N;
vector<MVP> m;
for (int i = 0; i < N && cin >> name >> S >> P; ++i) {
m.push_back(MVP(name, S, P));
}
sort(m.begin(), m.end());
for (int i = 0; i < N; ++i) {
if (i) {
cout << " ";
}
cout << m[i].name;
}
cout << endl;
return 0;
}
※ 引述《kkkmode (kkk)》之铭言:
: 我拿你的code去编译
: 发现要加#include<string.h> 或 include<cstring>才会编过
: <cName>是在C++引用C的header<Name.h>的习惯
: 这题有两个重点:
: 1.先排序不重要的index再排序重要的
: 2.如何用标准库排序自定义类型
: 以下是我改写的code,可以参考一下
: #include <iostream>
: #include <vector>
: #include <algorithm>
: #include <functional>
: #include <string>
: using namespace std;
: struct playerInfo
: {
: int salary;
: int fans;
: string name;
: };
: bool by_salary(const playerInfo& p1,const playerInfo& p2)
: {
: return p1.salary > p2.salary;
: }
: bool by_fans(const playerInfo& p1,const playerInfo& p2)
: {
: return p1.fans > p2.fans;
: }
: int main(){
: vector<playerInfo > playerList;
: unsigned int size=0;
: cin>>size;
: for(int i=0;i<size;i++) //input player's information
: {
: playerInfo temp;
: cin>>temp.name>>temp.salary>>temp.fans;
: playerList.push_back(temp);
: }
: sort(playerList.begin(),playerList.end(),by_fans);
: sort(playerList.begin(),playerList.end(),by_salary);
: for(int i=0;i<size;i++) //output player's information
: cout<<playerList[i].name<< (i<size-1 ? ' ':'\n');
: return 0;
: }
: ※ 引述《ga544523 (美丽新世界)》之铭言:
: : 开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
: : c++
: : 额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
: : iostream
: : 问题(Question):
: : http://truth.bahamut.com.tw/s01/201405/2827e54fa6e7853d0a80ffab1381d289.JPG
: : 错误结果(Wrong Output):
: : http://truth.bahamut.com.tw/s01/201405/08372dfa3afb99c7500459ef7f41b9e9.JPG
: : 程式码(Code):(请善用置底文网页, 记得排版)
: : #include<iostream>
: : using namespace std;
: : int main(){
: : char (*a)[50] = new char[100000][50];
: : char (*tmp)[50] = new char[100000][50];
: : long long (*b)= new long long[100000];
: : long long (*c)= new long long[100000];
: : long long d;
: : cin>>d;
: : for(int i=0;i<d;i++){
: : cin>>a[i];
: : cin>>b[i];
: : cin>>c[i];
: : }
: : for(int j=0;j<d-1;j++){
: : for(int i=0;i<d;i++){
: : if(b[i]<b[i+1]){
: : strcpy(tmp[i],a[i]);
: : strcpy(a[i],a[i+1]);
: : strcpy(a[i+1],tmp[i]);
: : swap(b[i],b[i+1]);
: : swap(c[i],c[i+1]);
: : }
: : if(b[i]==b[i+1]&&c[i]<c[i+1]){
: : strcpy(tmp[i],a[i]);
: : strcpy(a[i],a[i+1]);
: : strcpy(a[i+1],tmp[i]);
: : swap(b[i],b[i+1]);
: : swap(c[i],c[i+1]);}}}
: : for(int i=0;i<d;i++){
: : cout<<a[i]<<" ";}
: : delete [] a;
: : delete [] tmp;
: : delete [] b;
: : delete [] c;
: : return 0;}
: : 补充说明(Supplement):
: : 这是我的执行画面
: : http://truth.bahamut.com.tw/s01/201405/5baabcea5be42fd24b659947cde82090.JPG
: : 是我搞错题目意思还是哪里打错了吗
: : 测试没问题阿(应该巴.)
: : 传上去却一直说错误
: : ptt好难用喔
作者: kkkmode (kkk)   2014-05-05 21:34:00
这是一个不错的作法
作者: soheadsome (师大狗鼻哥)   2014-05-05 22:11:00
m.push_back(MVP(name, S, P)); 在c++11的话可以改成m.emplace_back(name, S, P);
楼主: ACMANIAC (請肥宅救救肥宅)   2014-05-06 02:02:00
程式竞赛的 compiler 非常落后的 XD 通常都是 GCC 3.3.X

Links booklink

Contact Us: admin [ a t ] ucptt.com