蓝桥杯每日练习

年龄巧合

暴力枚举每一个数字判断(注意题目上有两个人,找的是年龄大点的)

#include <iostream>
using namespace std;
int main()
{
  int st=0;
  for(int i=2014;;i--) {
    int age=2014-i;
    int year=i,cnt=0;
    while(year) {
      cnt+=year%10;
      year/=10;
    }
    if(age==cnt) {
      if(!st) st++;
      else {
        cout<<i<<endl;
        break;
      }
    }
  }
  return 0;
}

纸牌三角形

枚举全排列,然后进行判断。注意会有重复的情况,所以要除以重复数字6。那么为什么是6呢?九个数字围城一个环,按理说就会有九种方法切割,但是由于这道题边的性质所以角上的点对于每一种方案都是固定的,就只有不在角上的六个点

#include<iostream>

using namespace std;

const int N = 15;
int q[N], st[N];
int idx, ans;

void dfs(int k) {
	if (k == 9) {
		int sum1 = q[0] + q[1] + q[2] + q[3];
		int sum2 = q[3] + q[4] + q[5] + q[6];
		int sum3 = q[6] + q[7] + q[8] + q[0];
		if (sum1 == sum2 && sum2 == sum3) ans++;
		return;
	}
	for (int i = 1; i <= 9; i++) {
		if (!st[i]) {
			st[i] = 1;
			q[idx++] = i;
			dfs(k + 1);
			idx--;
			st[i] = 0;
		}
	}
}

int main() {
	dfs(0);
	cout << ans / 6 << endl;
	return 0;
}

取球游戏

先来想一下什么是必胜状态什么是必败状态(都是对于先手说的)?必胜状态就是说总有办法让对方达到必败的状态,必败状态就是说没有办法让对手达到必败状态。所以就可以判断每一种先手可以采取的策略,只要有一种能使对手达到必败局面就一定可以获胜,否则必败

#include <iostream>
#include <cstring>

using namespace std;

const int N=1e4+10;
int num[N];

int find(int k) {
  if(num[k]!=-1) return num[k];
  if(k>=1&&find(k-1)==0) num[k]=1;
  if(k>=3&&find(k-3)==0) num[k]=1;
  if(k>=7&&find(k-7)==0) num[k]=1;
  if(k>=8&&find(k-8)==0) num[k]=1; 
  //0必败1必胜,如果采取某一种方案能使对手达到必败局面,那么必胜
  if(num[k]==-1) num[k]=0;
  return num[k];
}

int main()
{
  memset(num,-1,sizeof(num));
  num[0]=1;
  int t;
  cin>>t;
  while(t--) {
    int n;
    cin>>n;
    cout<<find(n)<<endl;
  }
  return 0;
}
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习算法的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值