Codeforces Round #663 (Div. 2)比賽中做出的三題

2020-08-10 01:17:56

題意場

萌新認識到了手速的可怕。

c題有一個坑,ab又慫擔心不是真的水題,這場真的打炸了。

A. Suborrays

傳送門:https://codeforces.ml/contest/1391/problem/A

題意:給你一個n,讓你寫出一個n的排列,要求任意選一段長度,長度內的數按位元或運算大於等於這個長度。

解法:似乎你怎麼輸出這個排列都可以,只要這真的是個排列

程式碼:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void rlmn()
{
	int n;
	scanf("%d",&n);
	for (int i=n;i>=1;i--)
	{
		printf("%d ",i);
	}
	printf("\n");
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)rlmn();
	return 0;
}

B. Fix You

題意:給你一個字元矩陣,R代表向右,D代表向下。(n,m)處有一個收球處C,球可能在字元矩陣的任何位置,要求必須滾到C處,請問最少要改幾個字母。

解法:遍歷右邊緣和下邊緣,右邊緣看R,下邊緣看D即可。

程式碼:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char a[205][205];
void rlmn()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for (int i=0;i<n;i++)
	{
		scanf("%s",a[i]);
	}
	int ans=0;
	for (int i=0;i<n;i++)
	{
		if (a[i][m-1]=='R')
			ans++;
	}
	for (int i=0;i<m;i++)
	{
		if (a[n-1][i]=='D')
			ans++;
	}
	printf("%d\n",ans);
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)rlmn();
	return 0;
}

C. Cyclic Permutations

題意:定義排列爲一個圖。每個數爲一個點。在每個數兩邊各找一個比它大但是最靠近的數,將這兩個點用無向邊連起來。如果這個圖有環,就認爲是好排列。請問給的n有多少好排列?因爲這個數很大,請mod1e9+7.

解法:找遞推關係。3的時候是2.然後4的時候相當於把3的數位全部+1,然後填一個1進去。1如果放在頭尾的話不會影響,因此是2*a_(n-1)。放在中間,必定能成環,因此是(n-1)!*(n-2)。

因此an=2*a_(n-1)+(n-1)!*(n-2)

不需要空間,直接遞推走到n就可以了。

程式碼:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
void rlmn()
{
	ll n;
	scanf("%lld",&n);
	ll jie=6;
	ll ans=2;
	for (ll i=4;i<=n;i++)
	{
		ans=(2*ans)%mod+(jie*(i-2))%mod;
		jie=jie*i%mod;
	}
	printf("%lld",ans%mod);
}
int main()
{
	int T;
	T=1;
	while(T--)rlmn();
	return 0;
}