求助站外题
  • 板块学术版
  • 楼主_QrSn_
  • 当前回复8
  • 已保存回复8
  • 发布时间2023/3/18 09:51
  • 上次更新2023/10/23 21:18:30
查看原帖
求助站外题
511253
_QrSn_楼主2023/3/18 09:51
问题 D: 2023DLOI 小甲 第四题 一半(1.5)
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:外部导入
提交:134
解决:24
题目描述
有n个数,保存在数组a[1...n],每次挑选数组当中的最大的一个数(如果有多个数都是最大的,随便挑选其中的一个最大数),
把该数变成原来的一半(向下取整,例如最大的数是5,那么会变成2),经过m次这样的操作之后,把a数组所有的数从小到大输出。

输入
第一行,两个整数,n和m。1<=n<=100,  1<=m<=10^9。
第二行,n个整数,第i个整数是a[i],  0<=a[i]<=10^9。

输出
一行,n个整数,从小到大的次序输出,相邻两个数之间输出一个空格。

样例输入 复制
6 4
1 2 3 21 5 4 
样例输出 复制
1 2 2 2 3 4 
来源/分类
模拟

Code:

#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("abm,avx,mmx,popcnt,sse,sse2,sse3,ssse3,sse4")
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[105];
inline int read() {
	register int x(0),y(1);register char c=getchar();
	while(c<'0'||c>'9') {
		if(c=='-')y=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9') {
		x=(x<<1)+(x<<3)+(c^48);
		c=getchar();
	}
	return x*y;
}
inline void write(int x) {
	if(x<0) {
		putchar('-');
		x=-x;
		write(x);
	} else {
		if(x>9) {
			write(x/10);
		}
		putchar(x%10+'0');
	}
}
int main(){
	n=read();m=read();
	for(int i=0;i<n;i++)
	{
		a[i]=read();
	}
	for(int i=0;i<m;i++)
	{
		sort(a,a+n);
		a[n-1]=a[n-1] >> 1;
	}
	sort(a,a+n);
	for(int i=0;i<n;i++)
	{
		write(a[i]);
		printf(" ");
	}
	return 0;
}

超时80分

2023/3/18 09:51
加载中...