第九届蓝桥杯

明码

题意:2个字节为一行,共16行,组成的01矩阵可以表示一个汉字(比赛的时候我居然没有读懂题意_(:з」∠)_,我怕不是一个five)

思路:输出每个数的二进制表示

bitset用法详解

bitset<8> t;   t可以存储8位二进制,t=n则是把n分解成8位二进制 前面补0

int main()
{
    freopen("in.txt","r",stdin);
    bitset<8> t;
    int n;
    int cnt=0;
    while(cin>>n)
    {
        cnt++;
        t=n;
        cout<<t;
        if(cnt%2==0) cout<<endl;
    }
}

bitset还有个函数 string tmp=t.to_string();//将数值转化为字符串。返回对应的字符串。

直接求二进制

int main()
{
    //freopen("in.txt","r",stdin);
    int n,m,w[16];
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=7;i>=0;--i) {w[i]=n&1;n>>=1;}         //不需要区分±
        for(int i=15;i>=8;--i) {w[i]=m&1;m>>=1;}
        for(int i=0;i<=15;++i)
        {
            if(w[i])
                cout<<'#';
            else cout<<' ';
        }


        cout<<endl;
    }
    long long ans=pow(9,9);
    cout<<ans<<endl;

}

乘积尾零  因子中5的个数

#include<iostream>
#include<cstdio>
using namespace std;
int num=0;
int main()
{
    //freopen("in.txt","r",stdin);
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        while(1)
        {
            if(n%2==0)
            {

                n/=2;
            }
            else if(n%5==0)
            {
                num++;
                n/=5;
            }
            else
            {
                break;
            }
        }

    }
    cout<<num;
}

测试次数

参考博客 谷歌面试题扔鸡蛋  跪了 

参考博客 扔鸡蛋理论

注释部分的代码是二维写的,未注释的是优化的

#include<bits/stdc++.h>
using namespace std;
int dp[5][1005];//代表第i部手机j层楼的最少测试次数   M层楼 / N个鸡蛋 条件下,最坏情况尝试次数最小的解
//void solve(int phone,int floor)
//{
//    for(int i=1;i<=phone;++i)
//        for(int j=1;j<=floor;++j)
//            dp[i][j]=j;
//    for(int i=2;i<=phone;++i)
//    {
//        for(int j=1;j<=floor;++j)       //j是枚举的总楼数
//        {
//            for(int k=1;k<j;++k)        //第一部手机扔出去的位置在k层 手机摔坏了,还有i-1部手机,k-1个楼层要测,手机没摔坏的话。还有i个手机,j-k个楼层要测
//                dp[i][j]=min(dp[i][j],max(dp[i-1][k-1],dp[i][j-k])+1);
//        }
//    }
//}
int ans[1005];
int pre[1005];
void solve(int phoneNum,int floorNum)
{
    for(int i=1;i<=floorNum;++i) ans[i]=i;

    for(int i=2;i<=phoneNum;++i)
    {
        for(int j=1;j<=floorNum;++j)
        {
            pre[j]=ans[j];
            ans[j]=j;
        }
        for(int j=1;j<=floorNum;++j)
            for(int k=1;k<j;++k)
        {
            ans[j]=min(ans[j],max(pre[k-1],ans[j-k])+1);
        }
    }

}
int main()
{
    //首先初始化为最坏情况
    solve(3,1000);
    //cout<<dp[3][1000]<<endl;
    cout<<ans[1000]<<endl;

}

日志统计我的题解

递增三元组

题意:请你统计有多少个三元组(i, j, k) 满足:1. 1 <= i, j, k <= N  2. Ai < Bj < Ck  

先前一直以为lower_bound(a.begin(),a.end())-a返回的是从a.begin()开始算的第几个

//最大数据是1e5,三重循环和二重循环都不OK
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int a[N],b[N],c[N];
int sum=0;
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;++i) cin>>a[i];
    for(int i=1;i<=n;++i) cin>>b[i];
    for(int i=1;i<=n;++i) cin>>c[i];
    sort(a+1,a+1+n);
    sort(b+1,b+1+n);
    sort(c+1,c+1+n);
    for(int i=1;i<=n;++i)
    {
        int x=lower_bound(a+1,a+1+n,b[i])-a-1;  //找到大于等于b[i]的第一个下标      查找a数组中多少小于b[i]的     x是下标,1~x总共x个
        int y=upper_bound(c+1,c+1+n,b[i])-c-1;  //在c中的下标是y,那么比c[i]大的数有y+1..n  总共n-y个
        cout<<x<<' '<<y<<endl;
        sum+=(x)*(n-y);
        cout<<sum<<endl;

    }
    cout<<sum<<endl;
    return 0;
}
//好叭,我知道了

螺旋线

找规律,会发现y=x(x>=0)和y=x+1(x<0)直线上的整点都是平方数,以他们为基准加减即可

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
LL dist(int x,int y)
{
    if(x==y&&x>=0) return (2*x)*(2*x);
    else if(y==x+1&&x<0)
    {
        x=-x;
        return (2*x-1)*(2*x-1);
    }
    if((x>=0&&y>=x)||(x<=0&&y>=-x)) return dist(y,y)-(y-x);            //y>0
    if((x>=0&&y>=0&&y<=x)||(x>=0&&y<=0&&y>=-x)) return dist(x,x)+(x-y);
    if((x>=0&&y<=0&&y<=-x)||(x<=0&&y<=0&&y<=x+1)) return dist(y-1,y)-(x-(y-1));
    if((x<=0&&y>=0&&y<=-x)||(x<=0&&y<=0&&y>=x+1)) return dist(x,x+1)+(y-(x+1));

}
int main()
{

    int x,y;
    while(cin>>x>>y)
    {
        cout<<dist(x,y)<<endl;
    }
    return 0;

}

全球变暖

题意:与海洋相邻的岛屿都会被淹没,问未来会有多少岛屿完全淹没

注意:可能一些陆地被淹没后,岛屿被分成了两部分,那么这个岛屿就没被完全淹没 不能直接拿淹没前的岛屿数减去淹没后的岛屿数

思路:把每个岛屿赋予了一个编号,将未被淹没的陆地放在一个新数组中,遍历这个新数组中陆地的编号,用set去重

拿淹没前的岛屿编号数减去淹没后的岛屿编号数

#include<iostream>
#include<cstring>
#include<set>
using namespace std;
const int N=1e3+10;
char a[N][N];
char b[N][N];
int vis[N][N];
set<int>s;
int dx[5]={0,0,0,1,-1};
int dy[5]={-1,1,0,0,0};
int n;
int len=0;
void dfs(int x,int y,int cnt)
{
    if(a[x][y]=='.') return ;                   //这是废话
    if(a[x][y]=='#'&&vis[x][y]==-1)
    {
        vis[x][y]=cnt;
        int flag=1;
        for(int i=0;i<5;++i)
        {
            int x2=x+dx[i],y2=y+dy[i];
            if(x2>=1&&x2<=n&&y2>=1&&y2<=n)
            {
                if(a[x2][y2]=='.') flag=0;     //    我先把边缘的给淹了,自然最后啥也不剩
                else dfs(x2,y2,cnt);
            }

        }
        if(flag)
            b[x][y]='#';

    }
}
int main()
{

    cin>>n;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
            cin>>a[i][j];
    memset(vis,-1,sizeof(vis));
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
        b[i][j]='.';

    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
        {
            if(a[i][j]=='#'&&vis[i][j]==-1)
            {
                ++len;      //从1开始打标签
                dfs(i,j,len);
            }
        }


    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
        {
            if(b[i][j]=='#')
            {
                s.insert(vis[i][j]);
                cout<<vis[i][j]<<endl;
            }

        }

    cout<<len-s.size()<<endl;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值