【ACM】—蓝桥杯大一暑期集训Day3

简介: 【ACM】—蓝桥杯大一暑期集训Day3

0392fe98af544665a7a1d2aefd8a4113.png

前言

因参加了我校的ACM暑期集训为之后的xcpc等赛事做准备,所以就有了此文哈哈。本文主要复盘做题的过程以及一些感悟,便于复习巩固。辣么现在废话也不多说啦,直接往下看吧哈哈。

A - Subtraction Game

来源:CodeForces - 1844A. Subtraction Game

题意: 两个人先后从一堆石子中取a或b个石子,最先无法取得石子的人就输了,输入给出a和b,要求输出的n使得先手开局必输。

解题思路

这道题其实是雷声大雨点小啦,就是谁先把石子取完让另一个人无法再取的话就赢了,那么只要后手的那个人取石子的时候能够全部取完让先手的无法取得即可求解,题目所给样例可能有点迷惑性哈。

示例代码

#include <bits/stdc++.h>
using namespace std;
int main() {
    int t,a,b;
    cin>>t;
    while (t--) {
        cin>>a>>b;
        cout<<a+b<<endl;
    }
    return 0;
}

B - 全排列

来源:洛谷P1706 全排列问题

解题思路

本题用dfs深搜回溯再剪枝把所有情况罗列出来即可

示例代码

#include<bits/stdc++.h>
using namespace std;
int n,g[105],s[105];
void print(){
  for(int i=1;i<=n;i++)
    printf("%5d",s[i]);
  printf("\n");
}
void dfs(int x){
  if(x==n){
    print();
    return;
  }
  for(int i=1;i<=n;i++){
    if(!g[i]){
      g[i]=1;
      s[x+1]=i;
      dfs(x+1);
      g[i]=0;
    }
  }
}
int main(){
  cin>>n;
  dfs(0);
}

C - 健康的奶牛

来源:洛谷P1460 [USACO2.1] 健康的荷斯坦奶牛 Healthy Holsteins

解题思路

这道题用dfs深搜不需要剪枝,本蒟蒻没有做出来,看了某位神犇的哇

示例代码

#include<bits/stdc++.h>
using namespace std;
int co[1001];
int a[1001];
int b[1001][1001];
int c[1001];
int n,m,minn=0x3f3f3f3f;
bool judge(int x){
  for(int i=1;i<=n;i++){
    int sum=0;
    for(int j=1;j<=x;j++)
      sum+=b[c[j]][i];
  if(sum<a[i])
    return false;   
  }
  return true;
}
void dfs(int t,int s){
  if(t>m){
    if(judge(s)){
      if(s<minn){
        minn=s;
        for(int i=1;i<=minn;i++)
          co[i]=c[i];
      }
    }
    return;
  }
  c[s+1]=t;
  dfs(t+1,s+1);
  c[s+1]=0;
  dfs(t+1,s);
}
int main(){
  cin>>n;
  for(int i=1;i<=n;i++)
    cin>>a[i];
  cin>>m;
  for(int i=1;i<=m;i++){
    for(int j=1;j<=n;j++)
      cin>>b[i][j];
  }
  dfs(1,0);
  cout<<minn<<' ';
  for(int i=1;i<=minn;i++)
    cout<<co[i]<<' ';
}

D - New Year Transportation

来源:CodeForces - 500A. New Year Transportation

解题思路

这题用for循环递推一下,理清思路即可。

示例代码

#include<iostream>
using namespace std;
int main()
{
  int a[30005];
  int n,t,i;
  cin>>n>>t;
  for(i=1;i<n;i++)
    cin>>a[i];
  for(i=1;i<t;i+=a[i]); //递推
  if(i==t)
    cout<<"YES"<<endl;
  else
    cout<<"NO"<<endl;
}

总结

Day3的题主要考察搜索,这类算法通常较难,需多加理解递归思想。

算法:dfs、bfs、回溯、递归、递推

感悟:dfs、bfs等算法的使用还需多加做题才能深入理解

总结:每个算法都有其巧妙处,搜索算法更是巧妙

相关文章
|
6天前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
58 0
|
6天前
|
Java C语言 C++
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
43 0
|
6天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
41 0
|
6天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-997 粘木棍
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-997 粘木棍
51 0
|
6天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1007 印章
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1007 印章
30 0
|
6天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1006 拿金币
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1006 拿金币
24 0
|
6天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1004 无聊的逗
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1004 无聊的逗
48 0
|
6天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1003 礼物
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1003 礼物
55 0
|
6天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1001 跳马
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1001 跳马
28 0
|
6天前
|
移动开发 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-998 娜神平衡
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-998 娜神平衡
43 0