二刷
用char
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
//cstring 是用来strcmp的
using namespace std;
struct node{
char nam[10];//大小可以多但是不能少
int age;
int worth;
};
bool cmp(node &a,node &b) {
if(a.worth!=b.worth)return a.worth>b.worth;
else if(a.age!=b.age) return a.age<b.age;
else return strcmp(a.nam,b.nam)<0;//非减注意一下
}
int book[250];
int main(){
int n,m,_2,_3;
char _1[10];
scanf("%d %d",&n,&m);
vector<node>v(n);
for(int i=0;i<n;i++){
scanf("%s %d %d",&v[i].nam,&_2,&_3);//char型变量或string如何用scanf赋值(?) //string不能直接赋值给char临时变量赋值后也会变为字符串,所以如果使用char就要直接输入到对象之中(注意)
v[i].age=_2;
v[i].worth=_3;
}
sort(v.begin(),v.end(),cmp);
vector<node> t;
for(int i=0;i<n;i++){
if(book[v[i].age]<=100){
book[v[i].age]++;
t.push_back(v[i]);//此时进去的就是按排好的顺序进去的,每个年龄取前一百个,因为输出最多一百,事先对数据进行缩小节省时间,10w缩成了2w(注意)
}
}
for(int j=1;j<=m;j++){
int _4,_5,_6,cnt=0;
scanf("%d %d %d",&_4,&_5,&_6);
vector<node> ans;
for(int i=0;i<t.size();i++){
if(t[i].age>=_5&&t[i].age<=_6){
cnt++;
ans.push_back(t[i]);
}
if((cnt==_4||i==t.size()-1)&&ans.size()!=0){//达成要求,或者到达最后一个元素(注意) 否则只有两个点能输出中间情况不能输出(注意)
printf("Case #%d:\n",j);
for(int q=0;q<cnt;q++){
printf("%s %d %d\n",ans[q].nam,ans[q].age,ans[q].worth);//如果一开始声明的是char而不是string就不需要.c_str();
}
break;
}
}
if(cnt==0){printf("Case #%d:\n",j);
printf("None\n");
}
}
return 0;
}
用string
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
//cstring 是用来strcmp的
using namespace std;
struct node{
string nam;//大小可以多但是不能少
int age;
int worth;
};
bool cmp(node &a,node &b) {
if(a.worth!=b.worth)return a.worth>b.worth;
else if(a.age!=b.age) return a.age<b.age;
else return a.nam<b.nam;//非减注意一下
}
int book[250];
int main(){
int n,m,_2,_3;
string _1;
scanf("%d %d",&n,&m);
vector<node>v(n);
for(int i=0;i<n;i++){
//慎用c_str()
cin>>_1;
scanf(" %d %d",&_2,&_3);//char型变量或string如何用scanf赋值(?) //string不能直接赋值给char临时变量赋值后也会变为字符串,所以如果使用char就要直接输入到对象之中(注意)
v[i].nam=_1;
v[i].age=_2;
v[i].worth=_3;
}
sort(v.begin(),v.end(),cmp);
vector<node> t;
for(int i=0;i<n;i++){
if(book[v[i].age]<=100){
book[v[i].age]++;
t.push_back(v[i]);//此时进去的就是按排好的顺序进去的,每个年龄取前一百个,因为输出最多一百,事先对数据进行缩小节省时间,10w缩成了2w(注意)
}
}
for(int j=1;j<=m;j++){
int _4,_5,_6,cnt=0;
scanf("%d %d %d",&_4,&_5,&_6);
vector<node> ans;
for(int i=0;i<t.size();i++){
if(t[i].age>=_5&&t[i].age<=_6){
cnt++;
ans.push_back(t[i]);
}
if((cnt==_4||i==t.size()-1)&&ans.size()!=0){//达成要求,或者到达最后一个元素(注意) 否则只有两个点能输出中间情况不能输出(注意)
printf("Case #%d:\n",j);
for(int q=0;q<cnt;q++){
printf("%s %d %d\n",ans[q].nam.c_str(),ans[q].age,ans[q].worth);//如果一开始声明的是char而不是string就不需要.c_str();
}
break;
}
}
if(cnt==0){printf("Case #%d:\n",j);
printf("None\n");
}
}
return 0;
}
总结
1.我一开始想到的思路近似于暴力解法,排序之后一个个找呗,这样肯定会超时,题干中说最多100个输出也就是提醒我们不需要这么多数据
2.先把数据处理成符合题意,并且变少,兵马未粮草先行
3. 通过比较再bool函数里strcmp与return a.string<b.string效果相同,但是char行数组更快一些,取个大于character number的值即可,同时下面的输入输出都用不到.c_str()
如果用string 并且前边有一个循环临时变量慎用.c_str(),因为即使以前赋过值他后面因为要给同一个地址赋其他的值所有的都会改变直接用cin
4.//达成要求,或者到达最后一个元素(注意) 否则只有两个点能输出中间情况不能输出(注意)if((cnt==_4||i==t.size()-1)&&ans.size()!=0)
5/此时进去的就是按排好的顺序进去的,每个年龄取前一百个,因为输出最多一百,事先对数据进行缩小节省时间,10w缩成了2w(注意)因为年龄200,最多输出100,20000,但是记住他是横向的,从左往右遍历,按照原来的顺序从左往右截取每个年龄段的100个,有可能到最后够100个或者不够100个,100个足够了,横向截每个年龄段的100个缩小数据量减少时间 绝了
5.char数组大小可以多但是不能少
英语
问题 这些问题太疯狂好好总结