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

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章