马里奥的银币3

马里奥有很多银币,有一天他又得到了一张魔法卡,只要使用这张魔法卡,就可以使得他的银币里面所有金额最大的银币都翻倍,所有金额最小的银币都加1(也就是银币中金额最大的银币和金额最小的银币都可能不止1个),其余的银币的金额不变;马里奥顿时觉得自己要发财了,迫不及待的使用了这张魔法卡,请你求出,马里奥使用了这张魔法卡之后,他的银币的金额分别是多少?

比如:假设马里奥存有的银币金额分别为8 5 2 8 2 4,那么使用魔法卡之后,他的银币的金额变为16 5 3 16 3 4;

输入

第一行是一个整数n代表马里奥有n个银币(n<=1000)

第二行有n个整数,用空格隔开,代表马里奥每个银币的金额

输出

一行有n个整数,用空格隔开,代表使用过魔法卡之后,马里奥的银币的金额,分别是多少?

样例输入 

6
8 2 7 8 2 4

样例输出 

16 3 7 16 3 4

这个题一开始没思路,后来想到老师课上讲了一个实现excel rank排名的方法,就应用了一下。

但感觉代码太长,应该有更巧妙的解法。。。

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <string>
#include<cmath>
#include<iomanip>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<stdio.h>
#include<cstdio>
#include<cstring>
#include<map>
#include<set>
#include<climits>
#define M 1000
using namespace std;
//long long  a[M + 5],/*f[M+5]*/b[M+5];
//char a[1000001], b[1000001], c[1000001];
//int a[M + 10][M+10],b[M+10][M+10];
int a[M + 5], b[M+5]={1}, c[M + 5], d[M + 5];
int main()
{
	int n,i,j;
	cin >> n;
	for (i = 1; i <= n; i++)//输入一组数;
	{
		cin >> a[i];
	}
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++)//遍历数组,如果有比a[i]小的,让b[i]加上一,如8,7,6最后8对应的b[i]出来的是3;
		{
			if (a[i] > a[j])
			{
				b[i]++;
			}
		}
	}
	int maxn = 0, minx = INT_MAX;
	for (i = 1; i <= n; i++)
	{
		if (b[i] > maxn)
		{
			maxn = b[i];//找到最大的b,同时即找到最大的a。
		}
		if (b[i] < minx)
		{
			minx = b[i];//最小的。
		}
	}
	for (i = 1; i <= n; i++)
	{
		if (b[i] == maxn)
		{
			a[i] = a[i] * 2;//最大的*2
		}
		if (b[i] == minx)
		{
			a[i] = a[i] + 1;//最小的加1
		}
	}
	for (i = 1; i <= n; i++)
	{
		cout << a[i] << " ";//输出
	}

       
	return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值