UESTC 759 倒推数组

倒推数组

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

我们给出一个奇怪的公式: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 Input Sample Output
2
2 10
2 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 
#include 
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


谢谢


你可能感兴趣的:(思维题,UESTC,OJ,算法的艺术)