列表

详情


NC53007. 数列

描述

小乔有一个长度为n的整数数列,最开始里面所有的值都为0小乔需要将在1…n的每一个位置填入一个大于0的正整数,得到一个新的数列,并且这个数列所有数的和不超过m小乔对这个数列会有一个喜爱度,小乔对这个数列的喜爱度为满足2<=i<=n并且a[i]=a[i-1]+1的i的个数。现在给出n,m,请你制定一种填数方案,最大化小乔对数列的喜爱度。方案可能有多种,你只需要输出任意一种即可。

输入描述

第一行两个整数n,m。1<=n<=1e5,n<=m<=1e9。

输出描述

一行n个整数,表示位置1…n填的数。

示例1

输入:

5 9

输出:

1 2 1 2 3

说明:

小乔对数列的喜爱度为3,没有能使喜爱度大于3的方案了,此外1 2 3 1 2也是一个合法的方案

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 8ms, 内存消耗: 608K, 提交时间: 2019-09-07 11:01:01

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,mx=1e9;
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        if(1ll*i*(1+n/i)*(n/i)/2+1ll*(n%i)*(n/i+1)<=m) mx = min(mx,i);
    for(int i=1;i<=n%mx;i++){
        for(int j=1;j<=n/mx+1;j++)
        printf("%d ",j);
    }
    for(int i=1;i<=mx-n%mx;i++){
        for(int j=1;j<=n/mx;j++)
        printf("%d ",j);
    }
    puts("");
}

C++11(clang++ 3.9) 解法, 执行用时: 10ms, 内存消耗: 508K, 提交时间: 2019-09-06 21:26:00

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,N;
int main()
{
	scanf("%d%d",&n,&m);
	N=n;
	for(int i=1;i<=n;i++){
		int k=n/i,cost=k*(k+1)/2*i+n%i*(k+1);
		if(cost<=m){
			int z=0,s=1;
			while(z<n){
				for(int j=1;j<=k+(s<=(n%i));j++)
					printf("%d ",j),z++;
				s++;
			}
			break;
		}
	}
}

上一题