• 洛谷刷题(普及-):铺地毯、独木桥、三连击、阶乘之和


    记录洛谷刷题普及-qaq


    [NOIP2011 提高组] 铺地毯

    题目描述

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

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

    输入格式

    输入共 n + 2 n + 2 n+2 行。

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

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

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

    输出格式

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

    样例 #1

    样例输入 #1

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

    样例输出 #1

    3
    
    • 1

    样例 #2

    样例输入 #2

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

    样例输出 #2

    -1
    
    • 1

    提示

    【样例解释 1】

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

    【数据范围】

    对于 30 % 30\% 30% 的数据,有 n ≤ 2 n \le 2 n2
    对于 50 % 50\% 50% 的数据, 0 ≤ a , b , g , k ≤ 100 0 \le a, b, g, k \le 100 0a,b,g,k100
    对于 100 % 100\% 100% 的数据,有 0 ≤ n ≤ 1 0 4 0 \le n \le 10^4 0n104, 0 ≤ a , b , g , k ≤ 10 5 0 \le a, b, g, k \le {10}^5 0a,b,g,k105

    noip2011 提高组 day1 第 1 1 1 题。

    代码如下

    #include 
    int main()
    {
    	int i,n,x[10005],y[10005],a[10005],b[10005],x1,y1,k=1;
    	scanf("%d",&n);
    	for(i=0;i<n;i++)
    		scanf("%d%d%d%d",&x[i],&y[i],&a[i],&b[i]);
    	scanf("%d%d",&x1,&y1);
    	for(i=n-1;i>=0;i--)    //逆序输出
    	{
    	    if((x1>=x[i]&&x1<=x[i]+a[i])&&(y1>=y[i]&&y1<=y[i]+b[i]))
    		{    printf("%d\n",i+1); k*=0;}
    		else continue;
    		if((x1>=x[i]&&x1<=x[i]+a[i])&&(y1>=y[i]&&y1<=y[i]+b[i]))
    	        break;     //输出最大的跳出循环
    	}
    	if(k==1) printf("-1\n");
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    独木桥

    题目背景

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

    题目描述

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

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

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

    输入格式

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

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

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

    输出格式

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

    样例 #1

    样例输入 #1

    4
    2
    1 3
    
    • 1
    • 2
    • 3

    样例输出 #1

    2 4
    
    • 1

    提示

    对于 100 % 100\% 100% 的数据,满足初始时,没有两个士兵同在一个坐标, 1 ≤ L ≤ 5 × 1 0 3 1\le L\le5\times 10^3 1L5×103 0 ≤ N ≤ 5 × 1 0 3 0\le N\le5\times10^3 0N5×103,且数据保证 N ≤ L N\le L NL

    代码如下

    #include 
    int main(void)
    {
    	int l,n,max1=0,max2=0;
    	scanf("%d %d",&l,&n);
    	int a,i,temp,x,y;
    	for(i=0;i<n;i++)
    	{
    		scanf("%d",&a);
    		x=a;
    		y=l+1-a;
    		if(x>y)
    		{
    			temp=x;
    			x=y;
    			y=temp;
    		}
    		if(x>max1)
    			max1=x;
    		if(y>max2)
    			max2=y;
    	}
    	printf("%d %d",max1,max2);
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    [NOIP1998 普及组] 三连击

    题目背景

    本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。

    题目描述

    1 , 2 , … , 9 1, 2, \ldots , 9 1,2,,9 9 9 9 个数分成 3 3 3 组,分别组成 3 3 3 个三位数,且使这 3 3 3 个三位数构成 1 : 2 : 3 1 : 2 : 3 1:2:3 的比例,试求出所有满足条件的 3 3 3 个三位数。

    输入格式

    输出格式

    若干行,每行 3 3 3 个数字。按照每行第 1 1 1 个数字升序排列

    样例 #1

    样例输入 #1

    • 1

    样例输出 #1

    192 384 576
    * * *
    ...
    
    * * *
    (剩余部分不予展示)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    代码如下

    #include 
    int main()
    {
        int a,b,c;
        for(a=123;a<=333;a++)
                {
                    b=a*2;
                    c=a*3;
                    if((a/100+a/10%10+a%10+b/100+b/10%10+b%10+c/100+c/10%10+c%10==1+2+3+4+5+6+7+8+9)&&((a/100)*(a/10%10)*(a%10)*(b/100)*(b/10%10)*(b%10)*(c/100)*(c/10%10)*(c%10)==(1)*(2)*(3)*(4)*(5)*(6)*(7)*(8)*(9)))
                        printf("%d %d %d\n",a,b,c);
                }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    [NOIP1998 普及组] 阶乘之和

    题目描述

    用高精度计算出 S = 1 ! + 2 ! + 3 ! + ⋯ + n ! S = 1! + 2! + 3! + \cdots + n! S=1!+2!+3!++n! n ≤ 50 n \le 50 n50)。

    其中 ! 表示阶乘,定义为 n ! = n × ( n − 1 ) × ( n − 2 ) × ⋯ × 1 n!=n\times (n-1)\times (n-2)\times \cdots \times 1 n!=n×(n1)×(n2)××1。例如, 5 ! = 5 × 4 × 3 × 2 × 1 = 120 5! = 5 \times 4 \times 3 \times 2 \times 1=120 5!=5×4×3×2×1=120

    输入格式

    一个正整数 n n n

    输出格式

    一个正整数 S S S,表示计算结果。

    样例 #1

    样例输入 #1

    3
    
    • 1

    样例输出 #1

    9
    
    • 1

    提示

    【数据范围】

    对于 100 % 100 \% 100% 的数据, 1 ≤ n ≤ 50 1 \le n \le 50 1n50

    【其他说明】

    注,《深入浅出基础篇》中使用本题作为例题,但是其数据范围只有 n ≤ 20 n \le 20 n20,使用书中的代码无法通过本题。

    如果希望通过本题,请继续学习第八章高精度的知识。

    代码如下

    #include
    int main() {
    	int n;
    	int temp;
    	int i, j;//进行阶乘和求和时的临时变量
    	while(scanf("%d", &n)!=EOF){
    		int m[100] = {0};//存储阶乘结果
    		int num[1000] = {0};//存储求和结果
    		int len = 1, count = 0, C = 0, D = 0;//len为阶乘结果的位数,count为求和结果的位数;C为求阶乘时的进位,D为求和时的进位
    		m[0] = 1;//0的阶乘为1
    		for (i = 1; i <= n; i++) {
    			for (j = 0; j < len; j++) {
    				temp = m[j];
    				m[j] = (temp * i + C) % 10;
    				C = (temp * i + C) / 10;
    			}
    			while (C != 0) {
    				m[len] = C % 10;
    				C = C / 10;
    				len++;
    			}//以上两个循环用来求阶乘结果
    			for (count = 0; count < len; count++) {//求完阶乘直接加
    				temp = num[count];
    				num[count] = (temp + m[count] + D) % 10;
    				D = (temp + m[count] + D) / 10;
    			}
    			while (D != 0) {
    				m[count + 1] += D % 10;
    				D = D / 10;
    				count++;
    			}//以上两个循环用来求阶乘之和结果
    		}
    		for (i = count - 1; i >= 0; i--) 
    			printf("%d", num[i]);
    			printf("\n");
    	}
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    [NOIP1998 普及组] 幂次方

    题目描述

    任何一个正整数都可以用 2 2 2 的幂次方表示。例如 $137=27+23+2^0 $。

    同时约定方次用括号来表示,即 a b a^b ab 可表示为 a ( b ) a(b) a(b)

    由此可知, 137 137 137 可表示为 2 ( 7 ) + 2 ( 3 ) + 2 ( 0 ) 2(7)+2(3)+2(0) 2(7)+2(3)+2(0)

    进一步:

    7 = 2 2 + 2 + 2 0 7= 2^2+2+2^0 7=22+2+20 ( 2 1 2^1 21 2 2 2 表示),并且 3 = 2 + 2 0 3=2+2^0 3=2+20

    所以最后 137 137 137 可表示为 2 ( 2 ( 2 ) + 2 + 2 ( 0 ) ) + 2 ( 2 + 2 ( 0 ) ) + 2 ( 0 ) 2(2(2)+2+2(0))+2(2+2(0))+2(0) 2(2(2)+2+2(0))+2(2+2(0))+2(0)

    又如 1315 = 2 10 + 2 8 + 2 5 + 2 + 1 1315=2^{10} +2^8 +2^5 +2+1 1315=210+28+25+2+1

    所以 1315 1315 1315 最后可表示为 2 ( 2 ( 2 + 2 ( 0 ) ) + 2 ) + 2 ( 2 ( 2 + 2 ( 0 ) ) ) + 2 ( 2 ( 2 ) + 2 ( 0 ) ) + 2 + 2 ( 0 ) 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0) 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

    输入格式

    一行一个正整数 n n n

    输出格式

    符合约定的 n n n 0 , 2 0, 2 0,2 表示(在表示中不能有空格)。

    样例 #1

    样例输入 #1

    1315
    
    • 1

    样例输出 #1

    2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
    
    • 1

    提示

    【数据范围】

    对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 2 × 10 4 1 \le n \le 2 \times {10}^4 1n2×104

    代码如下

    #include
    #include
    #include
    #include 
    
    int n;
    void search(int x)
    {
    	if(n!=0)
    	{
    		int p=1,q=0;
    		printf("2");
    
    		while(x>=p)
    		{
    			++q; 
    			p*=2;	
    		}
    	
    		--q;
    		if(q==0 || q==2)printf("(%d)",q);
    	
            if(q>=3)
    		{
    			printf("("); 
    			search(q);
    			printf(")");
    		}
    		x-=p/2;
    		
    		if(x) 
    		{
    			printf("+");search(x);
    		}
    	}
    }
    int main()
    {
    	scanf("%d",&n);
    	search(n);
    	return 0;	
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
  • 相关阅读:
    经典算法-----汉诺塔问题
    nyoj 题目287 Radar 贪心算法
    python爬虫入门学习
    Leetcode24-两两交换链表中的节点详解
    和想象中完全不一样?巡课在线就能进行
    Win11如何取消任务栏隐藏?Win11取消任务栏隐藏的方法
    (01)ORB-SLAM2源码无死角解析-(38) EPnP 源代码分析(1)→PnPsolver总体流程与思路
    某30m小箱梁渠桥结构计算与施工图设计
    SpringMVC 学习(三)注解开发
    setup中使用 element-ui 的 Message弹框;setup中 间接使用 this的方法
  • 原文地址:https://blog.csdn.net/weixin_62529383/article/details/126796740