NC53007. 数列
描述
输入描述
第一行两个整数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; } } }