UESTC 759 倒推数组

来源:互联网 发布:linux ping 包大小 编辑:程序博客网 时间:2024/05/21 19:46

倒推数组

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
 

我们给出一个奇怪的公式:f(a)=ni=1nj=1min(ai,aj)

其中min(x,y) 表示x,y中的较小值。如果你对求和符号不太熟悉,我们也可以写成程序语言的形式:

int f = 0;  for (int i = 1; i <= n; ++i)    for ( int j = 1; j <= n ; ++j)      f = f + min (a[i], a[j]);

注意到这里a是一个数组,下标从1n,我们要求a数组满足以下条件:

  1. a中所有元素都是正整数。
  2. a中所有元素互不相同。

给定nf(a)的值,请构造出合法的a数组,如果有多个a数组满足条件,输出字典序最小的答案。关于字典序的进一步说明请看Hint。

如果满足条件的数组不存在,输出1

Input

第一行是一个数TT100),表示测试数据的组数。

每组测试数据包括一行,两个数nF,代表数列元素个数以及f(a)的值。(1n100,1F109    )

Output

对于每一组测试数据,输出一行。

如果有解,输出n个数,数之间用空格隔开,否则输出1

行末不允许有多余的空格,最后一个元素(如果有解)后面没有空格。

Sample input and output

Sample InputSample Output
22 102 2
1 7-1

Hint

对于两个长度均为N,下标从1N的数组AB,我们称A的字典序严格小于B,当且仅当存在下标XN,使得对于所有1i<x,均有AiBi相等,同时满足Ax<Bx

例如,长度为4的数组A=[1,2,3,4] 的字典序小于数组B=[1,2,4,3],因为存在下标3,有 A3<B3, 而且A1=B1,A2=B2

My Solution


为了字典序最小,前面保持1、2、3、4、5、6……n-1,只相应的变化a[n-1]的值

#include <iostream>#include <cstdio>using namespace std;const int maxn=128;int ans[maxn],fmin=0;//fmin记得要初始化的void firstans(const int &n){    for(int i=1;i<=n;i++){        ans[i]=i;    }}//F=(n+n-1)a1+(n-1+n-2)a2······2a(n-1)+an;  故要字典序最小,只要改变最后一项就好了,而且刚好最后一项系数为1,//这里就这么搞算数了void sum(const int &n){    for (int i = 1; i <= n; ++i){        for ( int j = 1; j <= n ; ++j)            fmin = fmin + min (ans[i], ans[j]);    }}int main(){    int n,F,T,err=-1;    scanf("%d",&T);    while(T--){        fmin=0;  //记得重置        scanf("%d%d",&n,&F);        firstans(n);        sum(n);        if(F<fmin) {printf("%d\n",err);continue;}        else {            ans[n]=n+F-fmin;            for(int i=1;i<n;i++)                printf("%d ",ans[i]);            printf("%d\n",ans[n]);//最后一个后面不能有空格而是直接换行        }    }    return 0;}


谢谢


0 0
原创粉丝点击