冒泡排序的典型题

Sereja owns a restaurant for n people. The restaurant hall has a coat rack with n hooks. Each restaurant visitor can use a hook to hang his clothes on it. Using the i-th hook costs ai rubles. Only one person can hang clothes on one hook.
Tonight Sereja expects m guests in the restaurant. Naturally, each guest wants to hang his clothes on an available hook with minimum price (if there are multiple such hooks, he chooses any of them). However if the moment a guest arrives the rack has no available hooks, Sereja must pay a d ruble fine to the guest.
Help Sereja find out the profit in rubles (possibly negative) that he will get tonight. You can assume that before the guests arrive, all hooks on the rack are available, all guests come at different time, nobody besides the m guests is visiting Sereja’s restaurant tonight.

    Input
    The first line contains two integers n and d (1 ≤ n, d ≤ 100). The next line contains integers a1, a2, ..., an (1 ≤ ai ≤ 100). The third line contains integer m (1 ≤ m ≤ 100).

    Output
    In a single line print a single integer — the answer to the problem.

Sereja拥有一家n人餐厅。餐厅大厅里有一个挂有n个挂钩的衣架。每个餐馆的客人都可以用钩子把衣服挂在上面。使用i-th挂钩要花费ai卢布。只有一个人能把衣服挂在一个钩子上。今晚塞蕾雅在餐馆里等着m位客人。当然,每个客人都想把自己的衣服挂在一个有最低价格的挂钩上(如果有多个这样的挂钩,他会选择其中一个)。然而,如果客人一到架子上就没有可用的挂钩,Sereja必须向客人支付d卢布的罚款。帮助瑟利亚找出他今晚将获得的卢布利润(可能是负数)。你可以假设在客人到达之前,架子上所有的挂钩都是可用的,所有的客人都在不同的时间来,除了m客人今晚没有人去Sereja的餐厅。输入第一行包含两个整数n和d(1≤n, d≤100)。下一行包含整数a1 a2…, an(1≤ai≤100)。第三行包含整数m(1≤m≤100)。输出在一行中打印一个整数——问题的答案。

#include"stdio.h"
int main()
{
int n,d;
while(~scanf("%d %d",&n,&d))
{
int sum=0,i,j,m,k,a[105],t;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&m);
for(j=0;j<n-1;j++)
{
for(i=0;i<n-j-1;i++)
{
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
}
}

	if(m<=n)
	{
		for(j=0;j<m;j++)
		{
			sum=sum+a[j];
		}
	}		
	else
	{
		for(k=0;k<n;k++)
		{
			sum=sum+a[k];
		}
		sum=sum-(m-n)*d;
	} 		
	printf("%d\n",sum);
}
return 0;

}
就这么一个题,被困住属实不该
有两点错误大概是时间长了容易遗忘
1、在定义数组循环范围这里,最开始写的i<105导致没有输出。

for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
2、在冒泡排序的for循环中,要多减一个1才行
for(i=0;i<n-j-1;i++)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值