目录
C. Cyclic Permutations(思维,排列组合)
A. Suborrays (思维)
思路:
线性输出就行了;
#include <bits/stdc++.h>
using namespace std;
int a[100010];
int main()
{
int t;
cin >>t;
while(t--)
{
int n;
cin >>n;
for(int i=1;i<=n;i++) cout <<i<<" ";
cout <<endl;
}
}
B. Fix You(思维)
思路:
对于1~n-1行的任意一个位置来说,只要第i行的最后一个位置是D就行;
对于第n行来说,除了最后一个位置,其他必须是R;
只有满足上面两个条件,才可;
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >>t;
while(t--)
{
int n,m;
cin >>n>>m;
int ans=0;
for(int i=0;i<n;i++)
{
char s[200];
cin >>s+1;
//cout <<s+1<<endl;
if(s[m]!='D'&&i!=n-1) ans++;
if(i==n-1)
{
for(int j=1;j<m;j++) if(s[j]!='R') ans++;
}
}
cout <<ans<<endl;
}
}
C. Cyclic Permutations(思维,排列组合)
思路:
首先,如果出现环的情况下,必定序列中出现了 ‘ V ’ 型峰;(由于合法序列太难构造,那就构造不合法的)那么构不成环的序列有以下几种情况:
- 只有一个 ‘ Λ ’型峰
- 单调递增
- 单调递减
怎样构造这几种情况呢;首先把 n 挑出来,剩下n-1个数,从大到小,依次选择放在n的左侧还是右侧;这样能直接构造出来上述三种情况;由于n-1个数,每个数有两个位置可以挑选,那么总共的不合法摆放方案数是;
最初总数量是n!,减去就是合法的序列方案数;
- n! -
#include <bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
typedef long long ll;
int main()
{
int n;
cin >>n;
ll res=1;
ll p=1;
for(ll i=1;i<=n;i++) res=res*i%mod,p=p*(i==n?1:2)%mod;
cout <<(res+mod-p+mod)%mod<<endl;
}
D. 505(DP,前缀和)
思路:
大致题意就是,给你一个二进制矩阵,如果他的任何一个偶数矩阵( 2x2 , 4x4 , 6x6 ...)里面含有的1的个数都是奇数,那么这个矩阵就是合法的;现在你可以执行一个操作任意次:任意取一个位置的数,进行取反;
然后,求要把这个矩阵变成合法矩阵,至少需要操作多少次,如果永远无法变成合法矩阵,输出-1;
首先可以确定当 n 3 (行数) 时,必定存在 4x4 的矩阵不符合题意;因为,4x4 矩阵的四个顶点上的 2x2 矩阵 如果合法的话,那么加起来必定是偶数个 1 ;所以 n
3 (行数)时,直接pass;(如下图)
然后就是对于n==2和n==3的情况进行枚举了,枚举第一列的情况,然后,后面第j列每次判断和前面的一列组成2x2的矩阵是否合法,如果不合法则改变这一列的值;注意,n==2和n==3要分开来算;
处理每一个状态的过程中,记录最小值即可;
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+7;
typedef long long ll;
int dp[3][N],mx[3][N];
int main()
{
int n,m,ans=0x3f3f3f3f;
char c;
cin >>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cin >>c;
if(i<3) mx[i][j]=c-'0';
}
if(n==1) cout <<0,exit(0);
if(n>3) cout <<-1,exit(0);
for(int i=0;i<(1<<n);i++)
{
int x=0,y=0,res=0;
for(int j=0;j<n;j++)
{
dp[j][0]=i>>j&1;
res+=mx[j][0]==dp[j][0]?0:1;
}
for(int j=1;j<m;j++)
{
dp[0][j]=mx[0][j],dp[1][j]=mx[1][j],dp[2][j]=mx[2][j];
x=dp[0][j]+dp[1][j]+dp[0][j-1]+dp[1][j-1];
if(n==3)
{
y=dp[1][j]+dp[2][j]+dp[1][j-1]+dp[2][j-1];
if((x&1)&&(y&1)) continue;
if(x&1) dp[2][j]=!dp[2][j],res++;
else if(y&1) dp[0][j]=!dp[0][j],res++;
else dp[1][j]=!dp[1][j],res++;
}
else
{
if(x%2==0) dp[0][j]=!dp[0][j],res++;
}
}
ans=min(ans,res);
}
cout <<ans<<endl;
}