小球(总结sort和cmp函数、结构体排序)

21 篇文章 1 订阅

 

                                                 问题 N: 小球(点击)

                                                              时间限制: 1 Sec  内存限制: 128 MB
                                                                          提交: 462  解决: 172
                                                              [提交] [状态] [讨论版] [命题人:admin]

题目描述

有R个红色盒子和B个蓝色盒子,还有R个红色小球和B个蓝色小球。每个盒子只能装一个小球,每个小球都要放在一个盒子里。如果把一个红色小球放在一个红色盒子里,那么得分是C。如果把一个蓝色小球放在一个蓝色盒子里,那么得分是D。如果把一个红色小球放在一个蓝色盒子里,那么得分是E。如果把一个蓝色小球放在一个红色盒子里,那么得分也是E。现在给出R,B,C,D,E。应该如何放置这些小球进盒子,才能使得总得分最大?输出最大的总得分。

 

输入

一行,5个整数,分别是R,B,C,D,E。(1 ≤ R ≤ 100,1 ≤ B ≤ 100,  -1000 ≤ C,D,E ≤ 1000)

 

输出

一个整数,最大总得分。

 

样例输入

复制样例数据

2  3  100  400  200

样例输出

1400

 

提示

#include<stdio.h>
int main()
{
    long long int sum[100006],n,m,c,d,e,k,i,j,temp;
    scanf("%lld%lld%lld%lld%lld",&n,&m,&c,&d,&e);
    k=0;
    if(n>=m){                        //先判断n和m的个数关系 因为如果不相同肯定不是交换m+n次
        for(i=0;i<=m;i++){
            sum[k++]=2*i*e+(n-i)*c+(m-i)*d;  //i表示从n和m中各自拿出的个数 由此可以计算总分数
        }                                                                    
    }
    else{
        for(i=0;i<=n;i++){
            sum[k++]=2*i*e+(n-i)*c+(m-i)*d;
        }
    }
    for(i=0;i<k-1;i++){
        for(j=0;j<k-i-1;j++){               //由于没改头文件 所以就先没用sort排序
            if(sum[j]<sum[j+1]){         
                temp=sum[j];
                sum[j]=sum[j+1];
                sum[j+1]=temp;
            }
        }
    }
    printf("%lld\n",sum[0]);            //输出最大的积分
    return 0;
}

虽然题目简单 但由于没搞清楚字母i的含义导致多次错误。

    scanf("%lld%lld%lld%lld%lld",&n,&m,&c,&d,&e);
    k=0;
    if(n>=m){
        for(i=0;i<=m;i+=2){
            sum[k++]=i*e+(n-(i/2))*c+(m-(i/2))*d;  //其实i并不是只可以取0 2 4 等偶数 因为由于i 
                                                    表示的含义是从m和n中各取小球的数目 所以i可                                                     
                                                    以取任意小于n或m的值。(错误点)
        }
    }
    else{
        for(i=0;i<=n;i+=2){
            sum[k++]=i*e+(n-(i/2))*c+(m-(i/2))*d;
        }
    }
 

总结 sort 和 cmp函数

1.对整形数值的使用:

int   cmp(int x,int y)

{

                        return x>y;    // 从大到小     return x<y;  // 从 小到大

}

这里面和在冒泡排序中对x和y的判断相反    因为这是返回时候的大小关系

而冒泡是对返回之前的大小关系的判断 然后做出排序

* 同样适用于 lang lang int 但注意一定要将cmp函数中所有的int换掉 不然提交后会报错(报错今天遇到最多的就是忘记加& 确实     不应该)。

2.对浮点型的数值的使用:

double cmp(double x,double y)

{

                        return x>y;    // 从大到小     return x<y;  // 从 小到大

}

3.达到像冒泡中对二维数组a[i][0]的排序 :(使用结构体)

普通冒泡排序:

     for(i=0;i<k-1;i++){
        for(j=0;j<k-i-1;j++){
            if(sum[j][0]<sum[j+1][0]){
                temp=sum[j][0];
                sum[j][0]=sum[j+1][0];
                sum[j+1][0]=temp;

                temp=sum[j][1];
                sum[j][1]=sum[j+1][1];
                sum[j+1][1]=temp;
            }
        }
    }

使用结构体排序: (c++头文件)

struct node{
    int x,y;        //定义结构体
}a[10006];

int cmp(node a,node b)
{
    return a.x<b.x;  //按照x  即a[0][0]和a[1][0]的大小关系排序  若为y则按照a[0][1]和a[1][1]
}


for(i=0;i<n;i++){
    scanf("%d%d",&a[i].x,&a[i].y);   //结构体的输入
}




//使用sort

sort(a,a+n,cmp);       //从0开始的n个值的排序

sort(a,a+n+1,cmp);  //从1开始的n个值的排序

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值