代码和解析
#include<bits/stdc++.h>
using namespace std;
int a[5][5]={{1,0,1,0,1}}; //记录图中圆圈内的值,并初始化第1行
int gate[11]; //记录10个逻辑门的一种排列
int ans; //答案
int logic(int x, int y, int op){ //逻辑操作:c=1:与; c=2:或; c=3:异或if(op == 1) return x & y; //与if(op == 2) return x | y; //或return x ^ y; //异或
}
int check(){ //检查10个逻辑门的排列,最后out是否为1int op = 0;for(int i = 1; i <= 4; i++) //从上到下有4行逻辑门for(int j = 0; j <= 4 - i; j++) //每一行从左到右a[i][j] = logic(a[i-1][j], a[i-1][j+1], gate[op++]);//这里的++先运算完再++ if(a[4][0]) return 1; //out=1,结果正确return 0;
}
void dfs(int k){ //第k个逻辑门if(k == 10){ //一共有10个逻辑门,现在都分配好了。下面模拟这一种组合方式if(check()) ans++; //out=1,结果正确return;}for(int i = 1; i <= 3; i++){ //第k个逻辑门有三种选择:与、或、异或gate[k] = i; //记录第k个逻辑门:与、或、异或dfs(k + 1); //继续深搜第k+1个逻辑门}
}
int main(){dfs(0);cout<<ans;return 0;
}
有奖问答
答案和解析
using namespace std;
int ans=0;
void dfs(int x,int score,int k)
{if(k==0)score=0;else{score+=10;if(score==100)return;}if(score==70)ans++;//计算有多种可能答案if(x==30)return;//当达到30题时终止dfs(x+1,score,0);//每次分两种情况讨论dfs(x+1,score,1);
}
int main()
{dfs(0,0,0);cout<<ans;
}
飞机降落
针对30%样例解析
#include <bits/stdc++.h>
using namespace std;//只过30%
int sum;
int num ;
int T[2]={0},D[2]={0},L[2]={0};
int main(){cin>>sum;//比较的组数while(sum--){cin>>num;if(num==1)cout<<"YES"<<endl;else {if(num==2){cin>>T[0]>>D[0]>>L[0];cin>>T[1]>>D[1]>>L[1];if(((T[0]+L[0])>(T[1]+D[1]))&&((T[1]+L[1])>(T[0]+D[0]))) cout<<"NO"<<endl;//先第一辆 else{cout<<"YES"<<endl;}}} }}
100分代码和解析
#include <bits/stdc++.h>
using namespace std;
int T[15],D[15],L[15];
int n;
int vis[15],ans;
void dfs(int plane,int time){if(plane==n){ //n架飞机都安排好了能降落ans=1;return;}for(int i=0;i<n;i++){if(!vis[i] && time<=T[i]+D[i]){ //剪枝int t = time; //t:安排给飞机i的降落时间if(t<T[i]) t=T[i]; //飞机i还没到,只能等它vis[i]=1; dfs(plane+1,t+L[i]);vis[i]=0;}}
}
int main(){int m; cin >>m; //m是测试组数while(m--){cin >> n;for(int i=0;i<n;++i) cin >> T[i] >> D[i] >> L[i];ans = 0;dfs(0,0);if(ans) cout<<"YES\n";else cout<<"NO\n";}return 0;
}