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;
}