列表

详情


NC217997. 牛客推荐系统开发之选飞行棋子

描述

牛客的新开发的推荐系统使得牛客的DAU(日活跃用户数量)上升了一个档次,于是牛客的老板组织了一场团建。在团建时,牛牛、牛妹、王清楚和茶山牛四人想要愉快地玩飞行棋:现在有种飞行棋子,一开始他们每个人每种棋子都有且仅有一个,但是不幸的是,有的人把一些棋子弄丢了,现在他们要分别在自己所拥有的棋子中选择一个出来玩游戏,要求他们四个人所选择的棋子的种类两两均不能相同,也就是说,任意两个人的棋子的种类都是不同的。你想知道一共有多少种选择棋子的方式。

输入描述

第一行输入一个整数,表示共有种棋子。(
接下来四行每行一个长度为的字符串,接下来的第行第个字符是表示第个人没有第种棋子,如果是则表示有第个人有第种棋子。

输出描述

输出一行一个整数表示一共有多少种选择棋子的方式。

示例1

输入:

3
000
000
000
000

输出:

0

示例2

输入:

4
1000
0100
0010
0001

输出:

1

示例3

输入:

4
1111
1111
1111
1111

输出:

24

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 18ms, 内存消耗: 1016K, 提交时间: 2021-06-13 21:14:02

#include<stdio.h>
long long f[5005][17];
char a[5][5005];
int main()
{
	int i,j,k,l,n,m;
	scanf("%d",&n);
	for(i=1;i<=4;i++){
	getchar();
	for(j=1;j<=n;j++)scanf("%c",&a[i][j]);}
	for(i=0;i<=n;i++)
	for(j=0;j<=15;j++)
	if(j==0)f[i][j]=1;
	else
	f[i][j]=0;
	for(i=1;i<=n;i++)
	for(j=1;j<=15;j++){
	f[i][j]+=f[i-1][j];//全都不选 
		for(k=1;k<=4;k++)
		if(1<<(k-1)&j&&a[k][i]=='1'){
		f[i][j]+=f[i-1][j^1<<(k-1)];
		}
}
printf("%lld",f[n][15]);
}

C++ 解法, 执行用时: 4ms, 内存消耗: 1016K, 提交时间: 2021-06-11 19:19:58

#include<iostream>
using namespace std;
#define ll long long
#define For(i,l,r) for(int i=l;i<=r;i++)
#define MAXN 10001
int N,a[4][MAXN];ll f[MAXN][1<<4];
int main()
{
    cin>>N;For(i,0,3)For(j,1,N){char c;cin>>c;a[i][j]=c-'0';}
    f[0][0]=1;For(i,1,N)For(j,0,15)For(k,0,3){if(!k)f[i][j]+=f[i-1][j];if(a[k][i]&&((j>>k)&1))f[i][j]+=f[i-1][j^(1<<k)];}cout<<f[N][15]<<endl;return 0;
}

上一题