NC20813. 黄魔法师
描述
输入描述
第一行两个整数 n, k (1 <= n <= 105, 0 <= k <= 1010)
输出描述
如果这样的数组不存在,输出 -1。
反之,输出一行 n 个整数,表示 a 数组,其中 1 <= ai <= 105。如果有多解,输出任意一个即可。
示例1
输入:
3 2
输出:
1 3 6
说明:
满足条件的有 (1, 2), (2, 3) 两对。示例2
输入:
3 1000000000
输出:
-1
说明:
显然不存在满足条件的数组。C++14(g++5.4) 解法, 执行用时: 15ms, 内存消耗: 1112K, 提交时间: 2018-10-27 23:41:45
#include<iostream> #include<stdio.h> #include<algorithm> #define LL long long using namespace std; const int maxn=1e5+10; int n;LL k; int a[maxn]; int main() { scanf("%d%lld",&n,&k); LL mx=1LL*n*(n-1)/2; if(k>mx)printf("-1\n"); else { for(int i=n;i;i--) if(mx-k>=i-1)mx-=i-1,a[i]=3; else { a[1]=14; int j; for(j=i;i-j<mx-k;j--)a[j]=98; for(;j>1;j--)a[j]=2; break; } for(int i=1;i<=n;i++)printf("%d ",a[i]); } return 0; }
C++(clang++11) 解法, 执行用时: 7ms, 内存消耗: 760K, 提交时间: 2021-02-22 08:36:20
#include <iostream> #include <cstdio> #define int long long #define N 100002 using namespace std; int n,k,m=1,i; signed main() { scanf("%lld%lld",&n,&k); if(k>n*(n-1)/2){ puts("-1"); return 0; } while(m*(m-1)/2<k) m++; for(i=1;i<=m-(m*(m-1)/2-k)-1;i++) printf("2 "); for(i=1;i<=m*(m-1)/2-k;i++) printf("98 "); printf("7 "); for(i=1;i<=n-m;i++) printf("1 "); puts(""); return 0; }