纪中学习之(第五季)DAY FIVE

前言

今天一大早就欣欣然睁开了眼,而且还是被呼噜声给吵醒的,唉,是我上面的五年级的蒟蒻(巨佬)······

今天做了四道题

比赛时才拿了10分,唉,其他题都是WA的WA,TLE的TLE,但之后又改了,爽,瞬间拿了160分

第一题

题目大意

对一个给定的自然数M,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为M


输入样例

10000

输出样例

18 142
297 328
388 412
1998 2002


解题思路

这道题一开始是用暴力来做的,后来发现时间超限,就把它优化了一下,交上去就AC了

程序如下

第一次做的60分代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define r register
using namespace std;
int m,a[1000000],b[1000000],t;
int main()
{
	freopen("combo.in","r",stdin);
	freopen("combo.out","w",stdout);
	scanf("%d",&m);
	for(r int i=1;i<=m/2;i++)
	{
		a[i]=a[i-1]+i;//前缀和
		if(a[i]>=m)//判断是否大于,如果大于就不用了
		{
			t=1;
			for(r int j=t;j<=i;j++)
			{
				if(a[i]-a[j]==m)//如果减去是等于M的,就证明是大于的
				{
					b[j+1]=i;
					t=j+1;
					break;
				}
				else if(a[i]-a[j]<m) 
				{
					t=j;
					break;
				}
			}
		}
	}
	for(r int i=1;i<=m-1;i++)
	{
		if(b[i]!=0)
		printf("%d %d\n",i,b[i]);	
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}

第二次AC的代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int m,a[100000],b[1000000];
int main()
{
	freopen("combo.in","r",stdin);
	freopen("combo.out","w",stdout);
	scanf("%d",&m);
	for(int i=1;i<=m-1;i++)
	{
		int t=0;
		for(int j=i;j<=m;j++)
		{
			t=t+j;
			if(t==m) 
			{
				printf("%d %d\n",i,j);
			}
			else 
			{
				if(t>m) 
				{
					break;
				}
			}
		}
	}
/*	for(int i=1;i<=m-1;i++)
	{
		for(int j=i;j<=m;j++)
		printf("%d %d\n",a[i],b[j]);
	}*/
	fclose(stdin);
	fclose(stdout);
	return 0;
 } 



第二题

题目大意

若给出1~n的一个排列A,则将A1、A2相加,A2、A3相加……An-1、An相加,则得到一组n-1个元素的数列B;再将B1、B2相加,B2、B3相加,Bn-2、Bn-1相加,则得到一组n-2个元素的数列……如此往复…输入一行两个整数n,t即最后求出来的数。两个0表示输入结束。
输出n个整数


输入样例

4 16
3 9
0 0

输出样例

3 1 2 4
1 3 2


解题思路

这道题是有关于杨辉三角的关系连接起来,再不断的推出公式即可




第三题

题目大意

给你一个数N,每张票有2N位,同时给你这2N位上的和S,如果这张票的前N位的和等于后N位的和,那我们称这张票是吉祥的,每一位可以取0-9
你的任务是计算吉祥票的总数


输入样例

2 2

输出样例

4


解题思路

这道题其实是用DP来做的




第四题

题目大意

现有n本书,编号1,2,…,n。每本Pi页。全部分给m个抄写员。每人分到顺序连续的若干本,每本只分给一人。求一种方案,使每人分到的页数和的最大值为最小。输出这个值


输入样例

9 3
100 200 300 400 500 600 700 800 900

输出样例

1700


解题思路

这道题我是用DP来做的,但是只对了60分,最后两个点TLE了,讲题时,巨佬说要用二分来做···我只打了DP

程序如下

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define r register
using namespace std;
long long n,m,f[5000][5000],t,a[5000]; 
int main()
{
	freopen("book.in","r",stdin);
	freopen("book.out","w",stdout);
	memset(f,127/3,sizeof(f));
	scanf("%lld%lld",&n,&m);
	for(r int i=1;i<=n;i++)
	{
		scanf("%lld",&t);
		a[i]=t+a[i-1];//前缀和
		f[i][1]=a[i];
	}
	for(r int i=2;i<=m;i++)
	{
		for(r int j=1;j<=n-m+i;j++)
		{
			for(r int k=1;k<j;k++)
			{
				f[j][i]=min(max(f[k][i-1],a[j]-a[k]),f[j][i]);
			}
		}
	}
	printf("%lld",f[n][m]);
	fclose(stdin);
	fclose(stdout);
	return 0;
}

今天就到这了······

明天继续更新·································

距离纪中培训倒计时7天(也就是更新到第10季)
敬请期待······

多多关注

谢谢········

上一篇:工业交换机SFP口和Combo口有什么不同?


下一篇:Codeforces Round #624 (Div. 3) problem C