求调!!SP43 & UVA714 & P1281 书的复制
  • 板块学术版
  • 楼主XingnoYi
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/6 17:03
  • 上次更新2025/1/7 10:54:11
查看原帖
求调!!SP43 & UVA714 & P1281 书的复制
735797
XingnoYi楼主2025/1/6 17:03

P1281 过了 SP 和 UVA 没过

#include <iostream>
#define big long long
using namespace std;
big T,n,m,maxn,sum,ans,plan[100005];
big a[100005];
bool check(big x)
{
	big num = 1, tmp = 0;
	for(big i = n;i >= 1;i--)
	{
		if(tmp+a[i] <= x)
		{
			tmp += a[i];
		}
		else
		{
			num++;
			tmp = a[i];
		}
	}
	return num > m;
}
int main()
{
	scanf("%lld",&T);
	while(T--)
	{
		sum = 0,maxn = 0;
		scanf("%lld %lld",&n,&m);
		for(big i = 1;i <= n;i++)
		{
			scanf("%lld",a+i);
			maxn = max(maxn,a[i]);
			sum += a[i];
		}
		big l = maxn, r = sum;
		while(l < r)
		{
			big mid = (l+r) >> 1;
			if(check(mid))
			{
				l = mid+1;
			}
			else
			{
				r = mid;
			}
		}
		big tmp = 0,cnt = 1;
		plan[1] = n;
		bool flag = 0;
		for(big i = n;i >= 1;i--)
		{
			if(flag == 0)
			{
				if(tmp+a[i] <= l)
				{
					if(tmp+a[i] == l)
					{
						flag = 1;
					}
					tmp += a[i];
				}
				else
				{
					plan[++cnt] = i;
					tmp = a[i];
				}
			}
			else
			{
				if(tmp+a[i] < l)
				{
					tmp += a[i];
				}
				else
				{
					plan[++cnt] = i;
					tmp = a[i];
				}
			}
		}
		plan[cnt+1] = 0;
		for(big i = cnt+1;i > 1;i--)
		{
			for(big j = plan[i]+1;j <= plan[i-1];j++)
			{
				printf("%lld",a[j]);
				if(!(i == 2 && j == plan[1]))
				{
					putchar(' ');
				}
			}
			if(i != 2)
			{
				printf("/ ");
			}
		}
		printf("\n");
	}	
	return 0;
}
2025/1/6 17:03
加载中...