hihoOffer收割练习20题目2

题目2 : SCI表示法

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

每一个正整数 N 都能表示成若干个连续正整数的和,例如10可以表示成1+2+3+4,15可以表示成4+5+6,8可以表示成8本身。我们称这种表示方法为SCI(Sum of Consecutive Integers)表示法。  

小Hi发现一个整数可能有很多种SCI表示,例如15可以表示成1+2+3+4+5,4+5+6,7+8以及15本身。小Hi想知道N的所有SCI表示中,最多能包含多少个连续正整数。例如1+2+3+4+5是15包含正整数最多的表示。

输入

第一行一个整数 T,代表测试数据的组数。  

以下 T 行每行一个正整数N。  

对于30%的数据,1 ≤ N ≤ 1000  

对于80%的数据,1 ≤ N ≤ 100000  

对于100%的数据,1 ≤ T ≤ 10,1 ≤ N ≤ 1000000000

输出

对于每组数据输出N的SCI表示最多能包含多少个整数。

样例输入
2  
15  
8
样例输出
5
1

本题与之前做的51nod 的1138 sum一题类似,是一个单调栈的应用题,两题的代码稍微改一下即可

代码如下:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<cmath>
#include<set>
#include<stack>
#define ll long long
using namespace std;

int main()
{

    int t;
    cin>>t;
    while(t--)
    {

    ll temp=0;
    ll maxlength=0,length=0;
   stack<ll>st;
    ll n;
    cin>>n;
    ll n1=n;
    //ll sum;
    ll count=0;
    ll i=1;
    while(n-1>1)
    {
        n-=i++;
        if(n%i==0)
        {
            if(n/i)
            {
                st.push(n/i);
                length=0;
                temp=0;
                for(ll k=n/i;k<=n1/2+1;k++)
                {
                    length++;
                    temp+=k;
                    if(temp==n1)
                    {
                        maxlength=max(maxlength,length);
                        break;
                    }
                }
            }

        }
    }
   // st.pop();
    if(st.empty())
        cout<<1<<endl;
    else
    {
        cout<<maxlength<<endl;
    }
    }
    return 0;
}











































































原文地址:https://www.cnblogs.com/bryce1010/p/9387449.html