代码和解析
#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是否为1
int 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;
}