1319:【例6.1】排队接水

本蒟蒻的第一条博客,初入茅庐,请多关照;

满分代码,可以直接抄

它说 给定两个元素,n和m,n是人数,m是时间

第一个排序问题应该比较好解决,就直接先把时间按从小到大的规则排好,输出相应的下标就ok了,不过,需要注意的是,这里需要有一个特判,就是时间相同的,先来的先接水,总不能让人家好不容易抢个位置然后再站到后头哇,不太好,所以,当时间相同的时候,就需要比较下标了,下标小的在前面,反之在后面,话不多说上代码!

//这里头文件就不打了哈,比较懒
//这里建议使用结构体哈,就像这样,个人觉得这样会方便一些
struct student{
    int time,top;
}st[1010];

//用于进行特判的函数 
bool cmp(student a, student b){
    if(a.time == b.time)
        return a.top < b.top;
    else return a.time < b.time;
}

int main(){
    int n,i;
    cin>>n;//输入n
    for(i=1;i<=n;i++){
        cin>>st[i].time;//输入每个人相应的时间
        st[i].top=i;//记录其相应的下标
    }    
    sort(st+1,st+n+1,cmp);//sort直接将其时间升序排列
    for(i=1;i<=n;++i)
        cout<<st[i].top<<" ";//对应输出其下标就ok啦
    cout<<endl;
}

接下来的问题就比较麻烦了,不过也是比较好理解的,就这样说吧,一个人接水后面的人等,每个人等的时间就是他接水的时间,乘以人数,就是等待时间,可能还不太明白,我打个比方就茅塞顿开了,上学的时候,想必大家都听过这样一句话,“你一个人浪费一分钟,51个人就是51分钟,这节课都下了,下节课都上了!”我们班是51个人哈,ta就和这个是一个道理,上代码!

double sum=0;//这里一定要用double类型啊 
    for(i=1;i<=n;++i){
        sum+=st[i].time*(n-i);//记录时间 
    }
    cout<<fixed<<setprecision(2)<<sum/n<<endl;//输出就OK啦 

所以,整体的话就应该是这样的

#include<bits/stdc++.h>
using namespace std;
struct student{
    int time,top;
}st[1010];
//用于进行特判的函数 
bool cmp(student a, student b){
    if(a.time == b.time)
        return a.top < b.top;
    else return a.time < b.time;
}
int main(){
    int n,i;
    cin>>n;//输入n
    for(i=1;i<=n;i++){
        cin>>st[i].time;//输入每个人相应的时间
        st[i].top=i;//记录其相应的下标
    }    
    sort(st+1,st+n+1,cmp);//sort直接将其时间升序排列
    for(i=1;i<=n;++i)
        cout<<st[i].top<<" ";//对应输出其下标就ok啦
    cout<<endl;
    double sum=0;//这里一定要用double类型啊 
    for(i=1;i<=n;++i){
        sum+=st[i].time*(n-i);//记录时间 
    }
    cout<<fixed<<setprecision(2)<<sum/n<<endl;//输出就OK啦 
    return 0;    
}

试题链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1319

 

posted @ 2020-08-19 22:32  ssdaeda  阅读(1887)  评论(2编辑  收藏  举报