zoukankan      html  css  js  c++  java
  • bzoj1653:Backward Digit Sums

    1653: [Usaco2006 Feb]Backward Digit Sums

    Time Limit: 5 Sec  Memory Limit: 64 MB
    Submit: 318  Solved: 239
    [Submit][Status][Discuss]

    Description

    FJ and his cows enjoy playing a mental game. They write down the numbers from 1 to N (1 <= N <= 10) in a certain order and then sum adjacent numbers to produce a new list with one fewer number. They repeat this until only a single number is left. For example, one instance of the game (when N=4) might go like this: 3 1 2 4 4 3 6 7 9 16 Behind FJ's back, the cows have started playing a more difficult game, in which they try to determine the starting sequence from only the final total and the number N. Unfortunately, the game is a bit above FJ's mental arithmetic capabilities. Write a program to help FJ play the game and keep up with the cows.

    Input

    * Line 1: Two space-separated integers: N and the final sum.

    Output

    * Line 1: An ordering of the integers 1..N that leads to the given sum. If there are multiple solutions, choose the one that is lexicographically least, i.e., that puts smaller numbers first.

    Sample Input


    4 16

    Sample Output


    3 1 2 4

    OUTPUT DETAILS:

    There are other possible sequences, such as 3 2 1 4, but 3 1 2 4
    is the lexicographically smallest.

    HINT

     

    Source

    Silver

    我能想到的是枚举。。然后不确定就去搜题解。。结果发现真的是枚举,而且考虑到枚举的话处理累加有点麻烦,就看了网上的题解就懂了。前后各加1次中间的都加n-1次;

    优化的部分原理如下

    f[1]=3+2;

    f[2]=2+1;f[1]=3+2+2+1

    f[3]=1+4;f[2]=2+1+1+4;f[1]=3+2+2+1+2+1+1+4;

    就是这样梓的原理,每一次都能够将涉及的节点的累加值求出来,方法要记住

    -----------------------------------------------------------------------------

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int a[11];
    int f[11];
    int main(){
     int n,m;
     scanf("%d%d",&n,&m);
     for(int i=1;i<=n;i++)
       a[i]=i;
     do{
      for(int i=1;i<=n;i++)
        f[i]=a[i];
      for(int i=1;i<n;i++)
        for(int j=i;j>=1;j--)
          f[j]+=f[j+1];
      if(f[1]==m){
       printf("%d",a[1]);
       for(int i=2;i<=n;i++)
         printf(" %d",a[i]);
       printf(" ");
       return 0;
      }
     }while(next_permutation(a+1,a+n+1));
     return 0;
    }

    ---------------------------------------------------------------------------------

  • 相关阅读:
    【BZOJ1854】游戏[SCOI2009](神奇贪心+并查集)
    P4177 [CEOI2008]order(网络流)最大权闭合子图
    P2472 [SCOI2007]蜥蜴(网络流)
    P2877 [USACO07JAN]牛校Cow School(01分数规划+决策单调性分治)
    bzoj3437 小P的牧场(斜率优化dp)
    P3628 [APIO2010]特别行动队(斜率优化dp)
    P3648 [APIO2014]序列分割(斜率优化dp)
    P4027 [NOI2007]货币兑换(斜率优化dp+cdq分治)
    P2365 任务安排 / [FJOI2019]batch(斜率优化dp)
    P3195 [HNOI2008]玩具装箱TOY(斜率优化dp)
  • 原文地址:https://www.cnblogs.com/20003238wzc--/p/4820232.html
Copyright © 2011-2022 走看看