问题 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分