CSU 1203: Super-increasing sequence 水题

本文介绍CSU 1203问题,涉及如何将整数序列通过合并相邻项转化为超递增序列。该题目被称为水题,意即难度较低。给定一个整数序列,每次操作可以将任意相邻项合并,目标是找到使最终超递增序列项数最多的策略。输入包含多组测试数据,每组包含序列长度N和N个正整数,输出为每个序列能形成的超递增序列的最大项数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CSU 1203: Super-increasing sequence 水题

Description

如果一个序列中任意一项都大于前面所有项之和,那么我们就称这个序列为超递增序列。

现在有一个整数序列,你可以将序列中任意相邻的若干项合并成一项,合并之后这项的值为合并前各项的值之和。通过若干次合并,最终一定能得到一个超递增序列,那么得到的超递增序列最多能有多少项呢?

Input

输入数据的第一行包含正整数T (1 <= T <= 500),表示接下来一共有T组测试数据。

每组测试数据的第一行包含一个整数N (1 <= N <= 100000),表示这个整数序列一共有N项。接下来一行包含N个不大于10000的正整数,依次描述了这个序列中各项的值。

至多有10组数据满足N > 1000

Output

对于每组测试数据,用一行输出一个整数,表示最终得到的超递增序列最多能有多少项。

Sample Input

3
2
1 1
3
1 2 4
6
1 2 4 3 6 5

Sample Output

1
3
4

Hint

Source

CSU Monthly 2013 Apr.
#include <iostream>
#include <cstdio>
using namespace std;
int a[100005];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int N;
        cin>>N;
        for(int i = 0 ; i < N ; i++)
            scanf("%d",&a[i]);
        int sum = a[0];
        int newsum = 0;
        int last = 1;
        int num = 1;
        while(last < N)
        {
            for(; last < N ; last++)
            {
                newsum += a[last];
                if(newsum > sum)
                {
                    num++;
                    sum += newsum;
                    newsum = 0;
                    last++;
                    break;
                }
            }
        }
        printf("%d\n",num);
    }
    return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值