题解 | #牛客推荐系统开发之静态特征获取#

牛客推荐系统开发之静态特征获取

https://ac.nowcoder.com/acm/contest/11174/A

从第一个人开始考虑他所有的棋子,如果他去了这颗棋子那么剩下的人就不能再取,于是修改剩下的人的该类棋子数为零,然后递归至第二个人,递归结束后再把棋子状态改回来。
这样dfs显然会超时,于是我们可以考虑到第三个人时及时刹车。
此时只剩下两个人,只要知道他们各自的棋子总数和重复的棋子数就行了。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
#include<string>
#include<map>
#define debug cout<<"**************"<<endl;
using namespace std;
const int mod=1e9+7;
const int maxn=1e6+10;
#define int unsigned long long
int t,n;
int mp[5][5010],qp[5][5010];    
        //开始的时候数组竟然开小了 
int ff(int x,int y,int z,int w)
{
    int ans=0;
    if(x==3){
      return z*y-w;    
    }
    for(int j=1;j<=n;j++)
        if(qp[x][j]==1){
           int t1=y,t2=z,t3=w;
           int e=qp[3][j],f=qp[4][j];
           if(qp[3][j])
               t1=y-1;
           if(qp[4][j])
               t2=z-1;
           for(int k=x+1;k<5;k++){
                  qp[k][j]=0;
           }
           if(e==f&&e==1)
               t3--;
           ans=ans+ff(x+1,t1,t2,t3);
           for(int k=x+1;k<5;k++){
                  qp[k][j]=mp[k][j];
           } 
        }
    return ans; 


signed main(){
    cin>>n;
    for(int i=1;i<=4;i++){
       char str[5100];
       cin>>str;
       for(int j=1;j<=n;j++){
             qp[i][j]=mp[i][j]=str[j-1]-'0';
       }    
    }
    int x,y,z,w;
    x=y=z=w=0;
    x=1;
    for(int i=1;i<=n;i++){
        if(mp[3][i])
        y++;
        if(mp[4][i])
        z++;
        if(mp[3][i]&&mp[4][i])
        w++;
    }
    cout<<ff(x,y,z,w)<<endl;
    return 0;


全部评论

相关推荐

01-21 12:26
暨南大学 golang
点赞 评论 收藏
分享
01-17 08:34
门头沟学院 Java
想找对象的单身狗在努力存钱:这工资不低了,再高点人家要招博士硕士的
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务