网站悬浮二维码/seo网站查询
牛客 选择困难症
没想到怎样去递归,看了题解恍然大悟,题解处理方案数的方式也很棒,另外要开long long!
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cstdio>
#include<iomanip>
#include<map>
#include<cmath>
#include<vector>
#include<queue>
#include<deque>
#include<list>
#include<stack>
#include<set>
#include<ctime>
#define ll long long
#define CHECK(x,y) (x>=0&&x<n&&y>=0&&y<m&&mg[x][y]!='#')
//#include<bits/stdc++.h>
using namespace std;
const ll maxx=1000005;
int dir[4][3]={{-1,0},{1,0},{0,-1},{0,1},};
int k,m,a[8][110],ai[8];
ll sum,mix[10];
void dfs(int now,int slov){if(now>k) return;for(int i=0;i<=ai[now];i++){if(slov+a[now][i]>m){sum+=mix[now+1]*(ai[now]-i+1);//加上剩下的组合数return;}dfs(now+1,slov+a[now][i]);}}
int main(){// freopen("in.txt","r",stdin);while(cin>>k>>m){memset(a,0,sizeof a);sum=0;for(int i=1;i<=k;i++){cin>>ai[i];for(int j=1;j<=ai[i];j++){cin>>a[i][j];}sort(a[i]+1,a[i]+ai[i]+1);}mix[k+1]=1;for(int i=k;i>=1;i--){mix[i]=mix[i+1]*(ai[i]+1);//计算组合数的前缀和}dfs(1,0);cout<<sum<<endl;}
return 0;
}
牛客 比赛
通过题解来理解题目意思。。。求的不是1-12第几题的概率,而是12道题完成了几题的概率。。中国文化博大精深啊,用dfs递归求完成了几道题的概率即可,不得不说这个题解思路是很棒的
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cstdio>
#include<iomanip>
#include<map>
#include<cmath>
#include<vector>
#include<queue>
#include<deque>
#include<list>
#include<stack>
#include<set>
#include<ctime>
#define ll long long
#define CHECK(x,y) (x>=0&&x<n&&y>=0&&y<m&&mg[x][y]!='#')
//#include<bits/stdc++.h>
using namespace std;
const ll maxx=1000005;
int dir[4][3]={{-1,0},{1,0},{0,-1},{0,1},};
double a[14],b[14],c[14],ans[14];
void dfs(int pro,int solve,double p){//做的题数 完成的题数 完成题数的概率if(pro>12){ans[solve]+=p;return;}//完成了solve道题的方案不止一种,所以是加号double sp=p*(1-(1-a[pro])*(1-b[pro])*(1-c[pro]));double up=p*(1-a[pro])*(1-b[pro])*(1-c[pro]);dfs(pro+1,solve+1,sp);dfs(pro+1,solve,up);}
int main(){//freopen("in.txt","r",stdin);for(int i=1;i<=12;i++) cin>>a[i];for(int i=1;i<=12;i++) cin>>b[i];for(int i=1;i<=12;i++) cin>>c[i];dfs(1,0,1);for(int i=0;i<=12;i++) printf("%.6f\n",ans[i]);
return 0;
}
牛客 石油采集
还是有点思维的感觉的,没想出来,哎呀怎么这么笨,从牛客的题解上看的: 一个位置的横纵坐标之和x+y,与之相邻位置的便是x+y+1或x+y-1,可得任意相邻的两个油田的横纵坐标之和必然是一奇一偶配对出现,可以通过统计当前区块下奇数和偶数的个数,然后进行奇偶配对,最终的结果则是取奇偶中小的值,即min(odd,even)。
原题解:https://blog.nowcoder.net/n/6df423951f5a47d6b0c0d149c3f5925c?f=comment
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cstdio>
#include<iomanip>
#include<map>
#include<cmath>
#include<vector>
#include<queue>
#include<deque>
#include<list>
#include<stack>
#include<set>
#include<ctime>
#define ll long long
#define CHECK(x,y) (x>=0&&x<n&&y>=0&&y<n&&a[x][y]=='#')
//#include<bits/stdc++.h>
using namespace std;
const ll maxx=1000005;
int dir[4][3]={{-1,0},{1,0},{0,-1},{0,1},};int n,even,odd,ans;char a[55][55];
void dfs(int x,int y){//做的题数 完成的题数 完成题数的概率a[x][y]='.';if((x+y)%2==0)even++;else odd++;for(int i=0;i<4;i++){int nx=x+dir[i][0];int ny=y+dir[i][1];if(CHECK(nx,ny))dfs(nx,ny);}}
int main(){// freopen("in.txt","r",stdin);int t,tt=1;cin>>t;while(t--){cin>>n;for(int i=0;i<n;i++){for(int j=0;j<n;j++){cin>>a[i][j];}}for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(a[i][j]=='#'){even=0,odd=0;dfs(i,j);ans+=min(odd,even);}}}cout<<"Case "<<tt++<<": "<<ans<<endl;}
return 0;
}