目录
题目链接:
P1093 - 分香蕉 - New Online Judge (ecustacm.cn)
思路:
结构体排序
坑一:
对结构体不熟练
回顾相关知识点:一定要多复习几遍
坑二:
最后是“按照输入顺序”输出对应猴子对应的香蕉总数。
所以要提前把输入序号记下来,最后恢复,然后再输出。
坑三:
记得break
代码:
通过10%:
原因:没看清题,人家要按原来的输入顺序输出!!!
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+3;
int banana[N];
struct monkey{
int weight;
int sum;
}monk[N];
bool cmp(monkey A,monkey B){
if(A.weight>B.weight){
return true;
}
else return false;
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>banana[i]; //banana[i]表示第i个香蕉的质量
}
for(int i=0;i<m;i++){
cin>>monk[i].weight; //monkey[i]表示第i个猴子的体重
monk[i].sum=0; //monkey[i]表示第i个猴子获得的香蕉的质量之和
}
sort(banana,banana+n,greater<int>());
//sort(monkey,monkey+n,greater<int>()); //注意greater适用的是int的,所以结构体的比较不适用
sort(monk,monk+m,cmp);
for(int i=0;i<n;){
for(int j=0;j<m;j++){
monk[j].sum+=banana[i];
i++;
}
}
for(int i=0;i<m;i++){
cout<<monk[i].sum<<" ";
}
return 0;
}
通过80%:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+3;
int banana[N];
struct monkey{
int weight;
int sum;
int id;
}monk[N];
bool cmp(monkey A,monkey B){
if(A.weight>B.weight){
return true;
}
else return false;
}
bool cmp2(monkey A,monkey B){
if(A.id<B.id){
return true;
}
else return false;
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>banana[i]; //banana[i]表示第i个香蕉的质量
}
for(int i=0;i<m;i++){
cin>>monk[i].weight; //monkey[i]表示第i个猴子的体重
monk[i].sum=0; //monkey[i]表示第i个猴子获得的香蕉的质量之和
monk[i].id=i;
}
sort(banana,banana+n,greater<int>());
//sort(monkey,monkey+n,greater<int>()); //注意greater适用的是int的,所以结构体的比较不适用
sort(monk,monk+m,cmp);
for(int i=0;i<n;){
for(int j=0;j<m;j++){
monk[j].sum+=banana[i];
i++;
}
}
sort(monk,monk+m,cmp2); //按编号排序,也就是回到初始排序
for(int i=0;i<m;i++){
cout<<monk[i].sum<<" ";
}
return 0;
}
通过100%:
应该还得加个判断,if(i>=n){break;}
因为如果不break,可能会超过N,造成数组越界。
要是开了很大的数组,最后都break一下
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+3;
int banana[N];
struct monkey{
int weight;
int sum;
int id;
}monk[N];
bool cmp(monkey A,monkey B){
if(A.weight>B.weight){
return true;
}
else return false;
}
bool cmp2(monkey A,monkey B){
if(A.id<B.id){
return true;
}
else return false;
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>banana[i]; //banana[i]表示第i个香蕉的质量
}
for(int i=0;i<m;i++){
cin>>monk[i].weight; //monkey[i]表示第i个猴子的体重
monk[i].sum=0; //monkey[i]表示第i个猴子获得的香蕉的质量之和
monk[i].id=i;
}
sort(banana,banana+n,greater<int>());
//sort(monkey,monkey+n,greater<int>()); //注意greater适用的是int的,所以结构体的比较不适用
sort(monk,monk+m,cmp);
for(int i=0;i<n;){
for(int j=0;j<m;j++){
monk[j].sum+=banana[i];
i++;
if(i>=n){
break;
}
}
}
sort(monk,monk+m,cmp2); //按编号排序,也就是回到初始排序
for(int i=0;i<m;i++){
cout<<monk[i].sum<<" ";
}
return 0;
}