列表

详情


NC25158. [USACO 2007 Feb B]Cow Yahtzee

描述

奶牛们以它们一贯笨拙的方式玩Yahtzee,一种掷骰子的游戏。他们掷N次(1 <= N <= 20) S(1 <= S <= 8)面骰子。他们对于能满足一定标准的掷出骰子的结果的数量很感兴趣(类似“包含3个2”或者“包含一个2和两个3”)。
教他们学会概率。写一个程序,不仅读入N和S,而且还有一些说明这些标准的表达式。从骰子的所有可能的组合中找出符合表达式要求的组合的数量(3个2面骰子所有可能的组合是 {1,1,1; 1,1,2; 1,2,1; 1,2,2; 2,1,1; 2,1,2; 2,2,1; 2,2,2};)。
这种组合的最基本的形式表达了“希望至少有W份R”看上去像这样:
WxR
这里满足(0 <= W <= N and 1 <= R <= S)。每次检验运行提供E个表达式(1 <= E <= 20),每个包含1~10个由“+”分割的基本形式。“+”表示“且”(看下面)。行与行之间的关系是“或者”。这样,下面所示的表达式的意思是:“至少有三个5 或者 同时至少有1个3和至少2个4”:
3x5
1x3+2x4
这里有一些满足上述条件的4个5面骰可能的情况:5,5,5,1; 4,5,5,5; 3,4,4,2; 3,4,4,3;3,4,4,5; 4,4,5,3。
注意:确保你能从一行中读取2个整数并在下一行中能读取一个字符串。对有某些语言的I/O设计来说,这比看上去的更难。
同时注意所有骰子可能的组合数在提供的测试数据里不会超过1,512,768。

输入描述

第 1 行: 三个由空格分开的整数: N, S 和 E
第 2 至 E+1 行: 第i+1 描述第i个表达式

输出描述

第 1 行: 一个整数,从骰子的所有可能的组合中找出符合表达式要求的组合的数量

示例1

输入:

4 5 2
3x5
1x3+2x4

输出:

63

说明:

这是按输入规则写的在上文中出现的情况。
63 种符合表达式的可能。

原站题解

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

C++11(clang++ 3.9) 解法, 执行用时: 347ms, 内存消耗: 488K, 提交时间: 2019-07-14 08:36:31

#include<bits/stdc++.h>
using namespace std;
string t;
long long a[25][15],b[25][15],c[10],l[25];
int main(){
	long long n,s,e;
	cin>>n>>s>>e;
	for(long long i=1;i<=e;i++){
		cin>>t;
		long long f=0;
		for(long long j=0;j<t.size();j++){
			if(t[j]!='+'&&t[j]!='x'){
				if(f%2==0)a[i][f/2]=a[i][f/2]*10+t[j]-48;
				else b[i][f/2]=b[i][f/2]*10+t[j]-48;
			}
			else f++;
		}
		l[i]=f/2;
	}
	long long b2=1,ans=0;
	for(long long i=1;i<=n;i++)
	b2*=s;
	for(long long k=0;k<b2;k++){
		memset(c,0,sizeof(c));
		long long a2=k,tot=0;
		while(tot<n){
			tot++;
			c[a2%s+1]++;
			a2/=s;
		}
		for(long long i=1;i<=e;i++){
			bool x=true;
			for(long long j=0;j<=l[i];j++)
			if(c[b[i][j]]<a[i][j])x=false;
			if(x){
				ans++;
				break;
			}
		}
	}
	cout<<ans<<'\n';
	return 0;
} 

C++14(g++5.4) 解法, 执行用时: 43ms, 内存消耗: 476K, 提交时间: 2019-07-14 16:46:54

//https://ac.nowcoder.com/acm/contest/993/G 
#include<bits/stdc++.h>
using namespace std;
int n,s,e,ans=0,b[30],a[30][10];
void dfs(int x)
{
	if(x==n+1)
	{
	    int c[10]={0};
		for(int i=1;i<=n;i++) c[b[i]]++;
		for(int i=1;i<=e;i++)
		{
			for(int j=1;j<=s;j++)
			{
				if(a[i][j]>c[j]) goto out; 
			}
			ans++;
			return ;
			out:;
		} 
	} 
	else
	{
		for(int i=1;i<=s;i++)
		{
			b[x]=i;
			dfs(x+1);
		}
	}
}
int main()
{
	cin>>n>>s>>e;
	string t;
	for(int i=1;i<=e;i++)
	{
		cin>>t;
		int len=t.length();
		for(int j=0;j<len;j+=4)
		 a[i][t[j+2]-'0']=t[j]-'0'; 
	}
	dfs(1);
	cout<<ans<<endl;
	return 0;
}

上一题