【蓝桥杯】——备战冲刺最后两周

1.算式900

 【蓝桥杯】——备战冲刺最后两周_第1张图片

 题解思路:一看到题目枚举0-9,我们就想到可以使用全排列函数next_permutation来解答这道题目,直接暴力全排列,然后判断是否满足条件且与题目给的答案不重复。

#include 
#include
using namespace std;
int main()
{
  int a[10]={0,1,2,3,4,5,6,7,8,9};
  do{
    int q=a[0]*1000+a[1]*100+a[2]*10+a[3];
    int w=a[4]*1000+a[5]*100+a[6]*10+a[7];
    int e=a[8]*10+a[9];
    if((q-w)*e==900&&q!=5012)
    {
      printf("(%d-%d)*%d=900",q,w,e);
      return 0;
    }
  }while(next_permutation(a,a+10));
  return 0;
}

 2.谈判

【蓝桥杯】——备战冲刺最后两周_第2张图片

解题思路:这题就是裸的哈夫曼树,和模板题一模一样,没有学过的建议去学一下应该很快懂,大概思路就是建立个小根堆,把这个看成一棵树,

有多少个父节点就会被合并多少次,每次挑当前所有堆最小的来合并

每次挑两个权值最小的点,深度一定最深,且可以为兄弟节点,然后合并完之后再放回树中,然后每次都循环寻找权值最小的两个点进行合并直到全部合并完,这样就是最优解。

#include 
#include
using namespace std;
int main()
{
  int n,a[10000];
  cin>>n;
  priority_queue,greater>heap;

  while(n--)
  {
    int x;
    scanf("%d",&x);
    heap.push(x);
  }
  int ans=0;
  while(heap.size()>1)
  {
    int a=heap.top();heap.pop();
    int b=heap.top();heap.pop();
      ans+=a+b;
      heap.push(a+b);
  }
  printf("%d",ans);

  return 0;
}

3.幸运数

【蓝桥杯】——备战冲刺最后两周_第3张图片

题解思路:这里我们将所有幸运数用递归的方式存到a数组中,然后再判断所给出区间内有多少个幸运数

#include
using namespace std;
const int N=1e6+10;
int a[N];//存幸运数
int m,n;
void dfs(int v){
  if(a[v]==0){
    return;
  }
  else{
    int j=1;
    for(int i=1;im&&a[i]

你可能感兴趣的:(蓝桥杯,c++,算法)