蓝桥的一些水题

蓝桥杯的比赛临近,开始刷一些蓝桥的题,大部分都挺水的就是暴力,然后就是dfs,在之后就是dp了还有一些基础的算法,有些还有点忘记了

1322: [蓝桥杯2017初赛]包子凑数

题意就不说了,都是中问题,没啥意思
思路:100数据小,最多也就是100个100也就是1e4,首先判断是否是INF,对所有的数进行一边gcd,如果最大公因数不是1,那么就表示有无数个,反之则是有限个,同时通过递推可以想到如果vis[j]可以得到,那么vis[j+a[i]]也可以得到,这样递推下去,在1到1e4里遍历一边计算vis=0的数即可,太暴力了。。。

#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
#define rep(i, a, n) for(int i = a; i < (int)n; i++)
#define per(i, a, n) for(int i = (int)n-1; i >= a; i--)
#define IOS std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define fopen freopen("file.in","r",stdin);freopen("file.out","w",stdout);
#define fclose fclose(stdin);fclose(stdout);
const int inf = 1e9;
const ll onf = 1e18;
const int maxn = 1e5+10;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
    while (isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
    return x*f;
}
int gcd(int a, int b){
    return b==0?a:gcd(b, a%b);
}
int vis[maxn];
signed main(){
    int n = read();
    int a[110];
    rep(i,0,n) a[i]=read(), vis[a[i]]=1;
    sort(a,a+n);
    int tmp = a[0];
    rep(i,1,n){
        tmp = gcd(tmp, a[i]);
    }
    if(tmp!=1){
        printf("INF\n");return 0;
    }
    rep(i,0,1e4+1){
        if(vis[i]){
            rep(j,0,n){
                if(i+a[j]>=maxn) break;
                vis[i+a[j]]=1;
            }
        }
    }
    int ans = 0;
    rep(i,1,1e4+1){
        if(!vis[i]) ans++;
    }
    printf("%d\n", ans);
    return 0;
}

1320: [蓝桥杯2017初赛]方格分割

思路:首先这是一个6X6的棋盘,如果被分割的两个部分相同,那么就意味着分割线是关于(3,3)对称的,这个可以想一下,之后对于(3,3)这个点进行dfs一遍,走一步,同时相当于这个点关于(3,3)对称的点也走过了,如果碰到头的话就表示这是一种分割方式,同时题目还说了,旋转对称的算同一种,那么除4即可。

#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
#define rep(i, a, n) for(int i = a; i < (int)n; i++)
#define per(i, a, n) for(int i = (int)n-1; i >= a; i--)
#define IOS std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define fopen freopen("file.in","r",stdin);freopen("file.out","w",stdout);
#define fclose fclose(stdin);fclose(stdout);
const int inf = 1e9;
const ll onf = 1e18;
const int maxn = 1e5+10;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
    while (isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
    return x*f;
}
int board[10][10], vis[10][10];
int dir[4][2] = {0,1,1,0,-1,0,0,-1};
int ans = 0;
void dfs(int x, int y){
    if(x==0||y==0||x==6||y==6){
        ans++;return ;
    }
    for(int i = 0; i < 4; i++){
        int ix = x+dir[i][0];
        int iy = y+dir[i][1];
        if(ix>=0&&iy>=0&&ix<=6&&iy<=6&&!vis[ix][iy]){
            vis[ix][iy] = 1;vis[6-ix][6-iy] = 1;
            dfs(ix, iy);
            vis[ix][iy] = 0;vis[6-ix][6-iy] = 0;
        }
    }
}
signed main(){
    vis[3][3] = 1;
    dfs(3, 3);
    cout<<ans/4<<endl;
    return 0;
}

1292: [蓝桥杯2016初赛]交换瓶子

思路:这一题纯粹是想多了,直接一遍遍历即可,就是真的一个一个交换过去

#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
#define rep(i, a, n) for(int i = a; i <= n; i++)
#define per(i, a, n) for(int i = n; i >= a; i--)
#define IOS std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define fopen freopen("file.in","r",stdin);freopen("file.out","w",stdout);
#define fclose fclose(stdin);fclose(stdout);
const int inf = 1e9;
const ll onf = 1e18;
const int maxn = 1e5+10;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
    while (isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
    return x*f;
}
int a[maxn];
signed main(){
    int n;
    while(cin>>n){
        int ans = 0;
        for(int i = 1; i <= n; i++){
            a[i]=read();
        }
        for(int i = 1; i <= n; i++){
            if(a[i]!=i){
                for(int j = i; j <= n; j++){
                    if(a[j]==i){
                        a[j]=a[i];
                        ans++;
                        a[i] = i;
                        break;
                    }
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

1285: [蓝桥杯2016初赛]寒假作业

思路:dfs,虽然说代码有点长,但是都是重复的

#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
#define rep(i, a, n) for(int i = a; i <= n; i++)
#define per(i, a, n) for(int i = n; i >= a; i--)
#define IOS std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define fopen freopen("file.in","r",stdin);freopen("file.out","w",stdout);
#define fclose fclose(stdin);fclose(stdout);
const int inf = 1e9;
const ll onf = 1e18;
const int maxn = 1e5+10;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
    while (isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
    return x*f;
}
int vis[40], ans=0;
int s=0;
stack<int> ss;
void dfs(int st){
    if(st==8){
        int tmp = 0;
        int i = 0;
        stack<int> ss1;
        ss1 = ss;
        while(!ss1.empty()){
            i++;
            printf("%d ", ss1.top());
            ss1.pop();
            if(i%2==0) printf("\n");
        }
        printf("\n");
        ans++;return;
    }
    if(st<2){
        for(int i = 1; i <= 13; i++){
            if(!vis[i]){
                vis[i]=1;
                if(s==0){
                    ss.push(i);
                    s = i;dfs(st+1);s=0;
                    ss.pop();
                }else {
                    int tmp = i+s;
                    if(!vis[tmp]&&tmp<=13&&tmp>=1){
                        ss.push(i),vis[tmp]=1;s=0;dfs(st+1);vis[tmp]=0;s=tmp-i;ss.pop();
                    }
                }
                vis[i]=0;
            }
        }
    }else if(st<4){
        for(int i = 1; i <= 13; i++){
            if(!vis[i]){
                vis[i]=1;
                if(s==0){
                    ss.push(i);
                    s = i;dfs(st+1);s=0;
                    ss.pop();
                }else {
                    int tmp = i-s;
                    if(!vis[tmp]&&tmp<=13&&tmp>=1){
                        ss.push(i),vis[tmp]=1;s=0;dfs(st+1);vis[tmp]=0;s=i-tmp;ss.pop();
                    }
                }
                vis[i]=0;
            }
        }
    }else if(st<6){
        for(int i = 1; i <= 13; i++){
            if(!vis[i]){
                vis[i]=1;
                if(s==0){
                    ss.push(i);
                    s = i;dfs(st+1);s=0;
                    ss.pop();
                }else {
                    int tmp = i*s;
                    if(!vis[tmp]&&tmp<=13&&tmp>=1){
                        ss.push(i),vis[tmp]=1;s=0;dfs(st+1);vis[tmp]=0;s=tmp/i;ss.pop();
                    }
                }
                vis[i]=0;
            }
        }
    }else if(st<8){
        for(int i = 1; i <= 13; i++){
            if(!vis[i]){
                vis[i]=1;
                if(s==0){
                    ss.push(i);
                    s = i;dfs(st+1);s=0;
                    ss.pop();
                }else {
                    if(i%s==0){
                        int tmp = i/s;
                        if(!vis[tmp]&&tmp<=13&&tmp>=1){
                            ss.push(i),vis[tmp]=1;s=0;dfs(st+1);vis[tmp]=0;s=i/tmp;ss.pop();
                        }
                    }
                }
                vis[i]=0;
            }
        }
    }
}
signed main(){
    dfs(0);
    printf("%d\n", ans);
    return 0;
}

1286: [蓝桥杯2016初赛]剪邮票

思路:同样的dfs,只不过有一点要注意的就是怎么算重复的,用二进制数来表示当前的状态就行,最后判断一下是否一样就ok

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值