NC25158. [USACO 2007 Feb B]Cow Yahtzee
描述
输入描述
第 1 行: 三个由空格分开的整数: N, S 和 E
第 2 至 E+1 行: 第i+1 描述第i个表达式
输出描述
第 1 行: 一个整数,从骰子的所有可能的组合中找出符合表达式要求的组合的数量
示例1
输入:
4 5 2 3x5 1x3+2x4
输出:
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; }