Codeforces Round #654 (Div. 2) 1371B

题目链接

题目大意:

给你一个 n ,一个 r ,涂日历,连续涂 n 天,涂日历的时候,日历一行的天数有 k 天,1<= k <= r ,k 在 1 - r 中任取,问,涂出来的形状有几种是不同的。

解题思路:

想象一下,涂日历是从左往右涂,一行涂完开始涂下一行,假如 k = 7,即一周有7天,那么 你在第一个格子中开始涂 是一种形状,在第二个格子开始涂也是一种,第三个开始是一种  ......  到第7个开始是一种。即一周有 k 天,就会有 k 种不同的形状。但是!!!这个的前提是 连续涂的 n 天是需要 大于 k 的,也就是必须大于 r, 再通俗点就是必须拐弯,不然,k > n 后一直都是 一横遛

所以 ,当 n > r 时,结果是  r * ( r+1 ) / 2 ,即 1 到 r 的等差数列求和

那当 n<r  的时候呢,k= n-1 之前,n 都是大于 k 的,依旧是k等于多少,就有 k 种,但是当k 大于等于 n 的时候,只能是横着一行,因为如果拐弯的画就不存在相邻了,也就是只存在 1 种。

所以,当 n <= r 时,结果是  1 + (n-1) *(n-1 +1) /2  , 就是  1 + (n-1) * n / 2 , 即 1 到 n-1 的等差数列求和

代码如下:

#include<iostream>
using namespace std;
int main()
{
	long long t,n,k,r;
	cin>>t;
	while(t--)
	{
		cin>>n>>r;
		if(n>r)
		{
			cout<<r*(r+1)/2<<endl;
		}
		else
		{
			cout<<1+(n-1)*n/2<<endl;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43819762/article/details/107093667