2022-3-21(洛谷)

好家伙,今天才知道,开全局数组默认都是0,不需要做清零操作~~~

蓝桥杯软件比赛中的注意事项(C/C++)_wufc的博客-CSDN博客_蓝桥杯能用万能头文件吗一.关于时间安排比赛时间4个小时,注意以提交题目的系统时间为准,做完一题交一题,避免最后因为时间不够没交完题。在4个小时中同一道题可以提交多次,每次提交都会覆盖上一次的代码。二.关于填空题今年蓝桥杯是5道填空,5道大题。一般第一道填空是签到题,也就是我们所说的送分题,可以通过一系列手段(比如Excel、word、电脑自带计算器、手算等)来得分。解决填空题一定要用最快的方法,能用工具解...https://blog.csdn.net/qq_42020529/article/details/98532657

铺地毯(模拟+枚举)

题目描述

为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 n 张地毯,编号从 1 到 n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。

地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。

输入格式

输入共 n + 2 行。

第一行,一个整数 n,表示总共有 n 张地毯。

接下来的 n 行中,第 i+1 行表示编号 i 的地毯的信息,包含四个整数 a ,b ,g ,k,每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标 (a, b) 以及地毯在 x 轴和 y 轴方向的长度。

第 n + 2 行包含两个整数 x 和 y,表示所求的地面的点的坐标 (x, y)。

输出格式

输出共 1 行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出 -1

输入 #1

3
1 0 2 3
0 2 3 3
2 1 3 3
2 2

输出 

3

输入 #2

3
1 0 2 3
0 2 3 3
2 1 3 3
4 5

输出 

-1

说明/提示

【样例解释 1】

如下图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,覆盖点 (2,2) 的最上面一张地毯是 3 号地毯。

【数据范围】

对于 30% 的数据,有 n≤2。
对于 50% 的数据,0≤a,b,g,k≤100。
对于 100% 的数据,有 0≤n≤10^4,0≤a,b,g,k≤10^5

#include<iostream>
using namespace std;

//铺地毯
int n,a[50001],b[50001],g[50001],k[50001],id[50001];
int x,y;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++){
        id[i]=i;//地毯编号
        scanf("%d%d%d%d",&a[i],&b[i],&g[i],&k[i]);
    }
    scanf("%d%d",&x,&y);
    int f=0,index;
    for(int i=n;i>=1;i--){//逆序寻找
        if(x>=a[i]&&x<=a[i]+g[i]&&y>=b[i]&&y<=b[i]+k[i]){
            f=1;
            index=id[i];
            break;
        }
    }
    if(f) cout<<index<<endl;
    else cout<<-1<<endl;
    return 0;
}

独木桥(模拟+思维)

题目背景

战争已经进入到紧要时间。你是运输小队长,正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景,而你留在桥下欣赏士兵们。士兵们十分愤怒,因为这座独木桥十分狭窄,只能容纳 1 个人通过。假如有 2 个人相向而行在桥上相遇,那么他们 2 个人将无法绕过对方,只能有 1 个人回头下桥,让另一个人先通过。但是,可以有多个人同时呆在同一个位置。

题目描述

突然,你收到从指挥部发来的信息,敌军的轰炸机正朝着你所在的独木桥飞来!为了安全,你的部队必须撤下独木桥。独木桥的长度为 L,士兵们只能呆在坐标为整数的地方。所有士兵的速度都为 1,但一个士兵某一时刻来到了坐标为 0 或 L+1 的位置,他就离开了独木桥。

每个士兵都有一个初始面对的方向,他们会以匀速朝着这个方向行走,中途不会自己改变方向。但是,如果两个士兵面对面相遇,他们无法彼此通过对方,于是就分别转身,继续行走。转身不需要任何的时间。

由于先前的愤怒,你已不能控制你的士兵。甚至,你连每个士兵初始面对的方向都不知道。因此,你想要知道你的部队最少需要多少时间就可能全部撤离独木桥。另外,总部也在安排阻拦敌人的进攻,因此你还需要知道你的部队最多需要多少时间才能全部撤离独木桥。

输入格式

第一行:一个整数 L,表示独木桥的长度。桥上的坐标为 1⋯L。

第二行:一个整数 N,表示初始时留在桥上的士兵数目。

第三行:有 N 个整数,分别表示每个士兵的初始坐标。

输出格式

只有一行,输出 2 个整数,分别表示部队撤离独木桥的最小时间和最大时间。2 个整数由一个空格符分开。

输入 

4
2
1 3

输出 

2 4

说明/提示

初始时,没有两个士兵同在一个坐标

数据范围 1≤L≤5×10^3,0≤N≤5×10^3,数据保证 N≤L。

分析:

当两个士兵在桥上相遇后掉头走 和 “穿过彼此”不掉头走 所用时间是一样的!!!

因此可以把n个士兵看做是同一个士兵在不同的初始位置选择向左或向右走下桥;

初始坐标x:向左走需要x时间,向右走需要(L-x+1) 时间;一个一个读进去,分别取min,max

又由于初始使所有士兵都在桥上,能同时行动,因此最外层都取 max

#include<iostream>
using namespace std;

//独木桥
int L,N,x;//桥长,士兵数,初始坐标
int maxt=0,mint=0;//最长,最短 时间
int main()
{
    scanf("%d%d",&L,&N);
    for(int i=1;i<=N;i++){
        scanf("%d",&x);
        mint=max(mint,min(x,L-x+1));
        maxt=max(maxt,max(x,L-x+1));
    }
    cout<<mint<<" "<<maxt<<endl;
    return 0;
}

数楼梯(高精+斐波那契数列)

题目描述

楼梯有 N 阶,上楼可以一步上一阶,也可以一步上二阶。

编一个程序,计算共有多少种不同的走法。

输入格式

一个数字,楼梯数。

输出格式

输出走的方式总数。

输入 

4

输出 

5

说明/提示

  • 对于 60% 的数据,0N≤50;// 用long long即可
  • 对于 100% 的数据,1≤N≤5000//高精度

可以在纸上列出前几个数据,找规律:

n=1,f(1)=1; (1)

n=2,f(2)=2; (1 1, 2)

n=3,f(3)=3; (1 1 1, 1 2 , 2 1)

n=4,f(4)=5; (1 1 1 1, 2 2, 1 1 2, 1 2 1, 2 1 1)

n=5,f(5)=8; (1 1 1 1 1, 1 1 1 2, 1 1 2 1, 1 2 1 1 , 2 1 1 1, 2 2 1, 1 2 1, 1 2 2)

... ...

看到数列:1 2 3 5 8 ... 想到斐波那契数列

但是,要知道数列增长速度很快,n>50时,数据就超过64位了,所以,,,

#include<iostream>
using namespace std;

//数楼梯(高精斐波那契数列)
int f[5005][5005],n,len;//f[i][j]:第i阶台阶对应的走法数
void fun(int k){//高精加
    for(int i=1;i<=len;i++)
        f[k][i]=f[k-1][i]+f[k-2][i];
    for(int i=1;i<=len;i++){//进位
        if(f[k][i]>=10){
            f[k][i+1]+=f[k][i]/10;
            f[k][i]%=10;
            if(f[k][len+1]>0) len++; 
        }
    }
}
int main()
{
    cin>>n;
    len=1;
    f[1][1]=1,f[2][1]=2;//初始化
    for(int i=3;i<=n;i++)
        fun(i);
    for(int i=len;i>=1;i--) cout<<f[n][i];
    return 0;
}

蜜蜂路线(与上题一样一样的)

题目描述

一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房 m 开始爬到蜂房 n,m<n,有多少种爬行路线?(备注:题面有误,右上角应为 n-1)

输入格式

输入 m,n 的值

输出格式

爬行有多少种路线

输入 

1 14

输出 

377

说明/提示

对于100%的数据,M,N≤1000

#include<iostream>
using namespace std;

//蜜蜂路线
int n,m,f[1005][1005],len;
void fun(int k){
    for(int i=1;i<=len;i++)
        f[k][i]=f[k-1][i]+f[k-2][i];//每一位分别用公式计算
    for(int i=1;i<=len;i++){
        if(f[k][i]>=10){
            f[k][i+1]+=f[k][i]/10;
            f[k][i]%=10;
        }
        if(f[k][len+1]>0) len++;//如果进位了,下次需计算len++次
    }
}
int main()
{
    cin>>m>>n;
    len=1;
    f[1][1]=1,f[2][1]=2;
    for(int i=3;i<=n-m;i++)
        fun(i);
    for(int i=len;i>=1;i--) cout<<f[n-m][i];//递推或者列举几个找到规律
    return 0;
}

数的计算(递推)

题目描述

我们要求找出具有下列性质数的个数(包含输入的正整数 n)。

先输入一个正整数 n(n≤1000),然后对此正整数按照如下方法进行处理:

  1. 不作任何处理;

  2. 在它的左边拼接一个正整数,但该正整数不能超过原数的一半;

  3. 加上数后,继续按此规则进行处理,直到不能再加正整数为止。

输入格式

一行,一个正整数 n(n≤1000)。

输出格式

一个整数,表示具有该性质数的个数。

输入 

6

输出

6

说明/提示

【样例解释】满足条件的数为:6,16,26,126,36,136。

递推:


f(1)=1; // 1
f(2)=f(2/2)+1; // 1, 12
f(3)=f(3/2)+1; // 1, 13
f(4)=f(1)+f(4/2)+1; // 1, 14, 24, 124
f(5)=f(1)+f(5/2)+1; // 1, 15, 25, 125
f(6)=f(1)+f(2)+f(6/2)+1;  
... ...
f(n)=f(1)+f(2)+...+f(n/2)+1;
#include<iostream>
using namespace std;

//数的计算
int n,f[1001];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i/2;j++){
            f[i]+=f[j];
        }
        f[i]++;//最后加上自己
    }
    cout<<f[n]<<endl;
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值