洛谷练习题

P1307 [NOIP2011 普及组] 数字反转

目录

P1307 [NOIP2011 普及组] 数字反转

P1317 低洼地

P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here

P1179 [NOIP2010 普及组] 数字统计

P1319 压缩技术

题目描述

给定一个整数 �N,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例 2)。

输入格式

一个整数 �N。

输出格式

一个整数,表示反转后的新数。

输入输出样例

输入 #1复制

123

输出 #1复制

321

输入 #2复制

-380

输出 #2复制

-83

说明/提示

【数据范围】

−1,000,000,000≤�≤1,000,000,000−1,000,000,000≤N≤1,000,000,000。

noip2011 普及组第一题

知识点:n%10为n的个位数     n/10删去个位数,

#include<bits/stdc++.h>
using namespace std;
//逆转数字 
int main(){
	long long int n;
	cin>> n;
	long long int b = 0; 
	while(n != 0){
		b = b*10 + n%10;
		n /= 10;
	}
	cout<< b << endl;
	return 0;
}

P1317 低洼地

题目描述

一组数,分别表示地平线的高度变化。高度值为整数,相邻高度用直线连接。找出并统计有多少个可能积水的低洼地?

如图:地高变化为 0 1 0 2 1 2 0 0 2 0

输入格式

两行,第一行n,表示有n个数。第2行连续n个数表示地平线高度变化的数据,保证首尾为0。(3<=n<=10000,0<=高度<=1000)

输出格式

一个数,可能积水低洼地的数目。

输入输出样例

输入 #1复制

10
0 1 0 2 1 2 0 0 2 0

输出 #1复制

3

 

想法:有很多种解法,比较明显的是 低洼处 = 山峰 - 1

我的代码:确定左坡,确定右坡,count++。定义个 l = 0 作为标记,左坡的标志是  左大于右,右坡的标志是 左小于右,我们找到左坡a[i] < a[i-1],l = 1,在左坡存在的前提下,如果找到右坡 a[i] > a[i-1] && l == 1 ,此时count++,将标记归为 0

#include<bits/stdc++.h>
using namespace std;

int main(){
	int n;
	cin>> n;
	int a[10001];
	int l = 0;
	int count = 0;
	for(int i = 0; i < n; i++){
		cin>> a[i];
	}
	for(int i = 1; i < n; i++){
		if(a[i] < a[i-1]){
			//左坡形成
			l = 1; 
		}
		if(a[i] > a[i-1] && l == 1){
			l = 0;
			count++;
		}
	}
	cout<< count << endl;
	return 0; 
}

P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here

题目描述

众所周知,在每一个彗星后都有一只 UFO。这些 UFO 时常来收集地球上的忠诚支持者。不幸的是,他们的飞碟每次出行都只能带上一组支持者。因此,他们要用一种聪明的方案让这些小组提前知道谁会被彗星带走。他们为每个彗星起了一个名字,通过这些名字来决定这个小组是不是被带走的那个特定的小组(你认为是谁给这些彗星取的名字呢?)。关于如何搭配的细节会在下面告诉你;你的任务是写一个程序,通过小组名和彗星名来决定这个小组是否能被那颗彗星后面的 UFO 带走。

小组名和彗星名都以下列方式转换成一个数字:最终的数字就是名字中所有字母的积,其中 AA 是 11,ZZ 是 2626。例如,USACOUSACO 小组就是 21×19×1×3×15=1795521×19×1×3×15=17955。如果小组的数字  mod 47mod47 等于彗星的数字  mod 47mod47,你就得告诉这个小组需要准备好被带走!(记住“� mod �amodb”是 �a 除以 �b 的余数,例如 34 mod 1034mod10 等于 44)

写出一个程序,读入彗星名和小组名并算出用上面的方案能否将两个名字搭配起来,如果能搭配,就输出 GO,否则输出 STAY。小组名和彗星名均是没有空格或标点的一串大写字母(不超过 66 个字母)。

输入格式

第1行:一个长度为 11 到 66 的大写字母串,表示彗星的名字。

第2行:一个长度为 11 到 66 的大写字母串,表示队伍的名字。

输出格式

输入输出样例

输入 #1复制

COMETQ
HVNGAT

输出 #1复制

GO

输入 #2复制

ABSTAR
USACO

输出 #2复制

STAY

说明/提示

题目翻译来自 NOCOW。

USACO Training Section 1.1

想法: 定义getchar()来接受回车。将大写字母作为数字运用到ASCLL码的知识,@是64,A是65,注意m,n定义初始值为1.

#include<bits/stdc++.h>
using namespace std;

int main(){
	string a, b;
	cin>> a;
	char ch = getchar();
	cin>> b;
	int m = 1, n = 1;
	for(int i = 0; i < a.length(); i++){
		m *= a[i] - '@';
	}
	for(int i = 0; i < b.length(); i++){
		n *= b[i] - '@';
	}
	m = m%47;
	n = n%47;
	if(m == n){
		cout<< "GO" << endl;
	}else{
		cout<< "STAY" << endl;
	}
	
	return 0;
}

P1179 [NOIP2010 普及组] 数字统计

题目描述

请统计某个给定范围[�,�][L,R]的所有整数中,数字 22 出现的次数。

比如给定范围[2,22][2,22],数字22 在数 22中出现了 11 次,在数1212 中出现 11 次,在数 2020 中出现 11次,在数 21 中出现 11 次,在数 2222 中出现 22次,所以数字22 在该范围内一共出现了 66次。

输入格式

22个正整数 �L 和 �R,之间用一个空格隔开。

输出格式

数字 22出现的次数。

输入输出样例

输入 #1复制

2 22

输出 #1复制

6

输入 #2复制

2 100

输出 #2复制

20

说明/提示

1≤�≤�≤1000001≤L≤R≤100000。

想法:首先要注意的是循环字母不可以直接拿来用,要使用另一个变量来接受,n%10为n的个位数,n/10将n降次,下一次循环n%10就是n的十位数

#include<bits/stdc++.h>
using namespace std;

int main(){
	long long int l, r;
	cin>> l >> r;
	int count = 0;
	for(int i = l; i <= r; i++){
		int n = i;
		while(n!= 0){
			if(n%10 == 2){
				count++;
			}
			n = n/10;
		}
	}
	cout<< count << endl;
	return 0;
}

P1319 压缩技术

题目描述

设某汉字由 �×�N×N 的 00 和 11 的点阵图案组成。

我们依照以下规则生成压缩码。连续一组数值:从汉字点阵图案的第一行第一个符号开始计算,按书写顺序从左到右,由上至下。第一个数表示连续有几个 00,第二个数表示接下来连续有几个 11,第三个数再接下来连续有几个 00,第四个数接着连续几个 11,以此类推……

例如: 以下汉字点阵图案:

0001000
0001000
0001111
0001000
0001000
0001000
1111111

对应的压缩码是: 7 3 1 6 1 6 4 3 1 6 1 6 1 3 77 3 1 6 1 6 4 3 1 6 1 6 1 3 7 (第一个数是 �N ,其余各位表示交替表示0和1 的个数,压缩码保证 �×�=N×N= 交替的各位数之和)

输入格式

数据输入一行,由空格隔开的若干个整数,表示压缩码。

输出格式

表示最后的汉字点阵图(点阵符号之间不留空格)。

输入输出样例

输入 #1复制

7 3 1 6 1 6 4 3 1 6 1 6 1 3 7

输出 #1复制

0001000
0001000
0001111
0001000
0001000
0001000
1111111

说明/提示

数据保证,3≤�≤2003≤N≤200。

想法:首先,以后定义数组千万要定义在main函数外面,外面是数据域,里面是栈,存的多了容易爆栈。第一个循环停止输入。下面的循环判断i是技术还是偶数,奇数输出0, 偶数输出1.

#include <bits/stdc++.h>
using namespace std;
int a[205];
int main(){
	int n,s=0,count=0;
	//int a[205];
	cin>>n;
	for(int i = 1; i <= 205; i++){
		if(s >= n*n){
			break;
		}
		cin>> a[i];
		s = s + a[i];
	}
	for(int i = 1; i <= 205; i++){
		if(i % 2 == 1 || i == 1){
			for(int j = 0; j < a[i]; j++){
				cout<< 0;
				count++;
				if(count % n == 0){
					cout<< endl; 
				}
			}
		}else{
			for(int u = 0; u < a[i]; u++){
				cout<< 1;
				count++;
				if(count % n == 0){
					cout<< endl;
				}
			}
		}
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元堆堆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值