算法笔记3.1例题习题_简单模拟

一、害死人不偿命的(3n+1)猜想

在这里插入图片描述

#include<iostream>
using namespace std;
int is(int n);
int main() {
	int n,s=0;
	cin >> n;
	while (n != 1) {
		int t = is(n);
		if (t) {      //n是偶数
			n = n / 2;
			s++;
		}
		if (!t) {     //n是奇数
			n = (3 * n + 1) / 2;
			s++;
		}
	}
	cout << s;
}

int is(int n) {
	if (n % 2 == 0) return 1;
	else return 0;
}

在这里插入图片描述在这里插入图片描述

二、挖掘机技术哪家强

在这里插入图片描述

//结构体方法
#include<iostream>
using namespace std;
struct team {
	int num;
	int grade;
};
int main() {
	int N,maxnum=0;
	cin >> N;
	team t[100000] = { 0 };
	for (int i = 0;i < N;i++) {
		int n,g;
		cin >> n >> g;
		t[n].num = n;
		t[n].grade += g;
		if (n > maxnum) maxnum = n;
	}
	int max = t[0].grade,s=0;
	for (int i = 1;i <= maxnum;i++) {
		if (t[i].grade > max) {
			max = t[i].grade;
			s = i;
		}
	}
	cout << t[s].num << " " << t[s].grade << endl;
	return 0;
}
//数组(我比解析麻烦多了一个数组
#include<iostream>
using namespace std;
int main() {
	int N;
	int num[100000] = { 0 }, grade[100000] = { 0 };
	cin >> N;
	for (int i = 0;i < N;i++) {
		int n, g;
		cin >> n >> g;
		num[n] = n;
		grade[n] += g;
	}
	int t = 0;
	for (int i = 1;i < N;i++) {
		if (grade[i] > grade[i - 1]) t = i;
	}
	cout << num[t] << " " << grade[t];
}

在这里插入图片描述在这里插入图片描述

问题 A: 剩下的树

时间限制: 1 Sec 内存限制: 32 MB

题目描述
有一个长度为整数L(1<=L<=10000)的马路,可以想象成数轴上长度为L的一个线段,起点是坐标原点,在每个整数坐标点有一棵树,即在0,1,2,…,L共L+1个位置上有L+1棵树。
现在要移走一些树,移走的树的区间用一对数字表示,如 100 200表示移走从100到200之间(包括端点)所有的树。
可能有M(1<=M<=100)个区间,区间之间可能有重叠。现在要求移走所有区间的树之后剩下的树的个数。

输入
两个整数L(1<=L<=10000)和M(1<=M<=100)。
接下来有M组整数,每组有一对数字。

输出
可能有多组输入数据,对于每组输入数据,输出一个数,表示移走所有区间的树之后剩下的树的个数。

样例输入
4 2
1 2
0 2
11 2
1 5
4 7
0 0

样例输出
2
5

#include<iostream>
using namespace std;
int main() {
	int L, M;
	int a, b, n=0;
	while (cin >> L >> M) {
		int t[10001] = { 0 };          //0有1无树
		if (L >= 1 && L <= 10000 && M >= 1 && M <= 100) {
			for (int i = 0;i < M;i++) {   //输入M组数
				cin >> a >> b;
				for (int j = a;j <= b;j++) {  //移走每组区间内的树
					if (t[j] == 0) t[j] = 1;
				}
			}
			n = 0;
			for (int i = 0;i <= L;i++) {    //数还剩多少树
				if (t[i] == 0) n++;
			}
			cout << n << "\n";
		}
		else if (L == 0 && M == 0) {
			return 0;
		}
	}
}

问题 B: A+B

时间限制: 1 Sec 内存限制: 32 MB

题目描述
给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开。
现在请计算A+B的结果,并以正常形式输出。

输入
输入包含多组数据数据,每组数据占一行,由两个整数A和B组成(-10^9 < A,B < 10^9)。

输出
请计算A+B的结果,并以正常形式输出,每组数据占一行。

样例输入
-234,567,890 123,456,789
1,234 2,345,678

样例输出
-111111101
2346912

#include<iostream>
#include<cstring>
using namespace std;
int main() {
	char a[10] = { 0 }, b[10] = { 0 };
	while (cin >> a >> b) {
		int sa = 0, sb = 0;
		for (int i = strlen(a) - 1,t=1;i >= 0;i--) {
			if (a[i] >= '0'&&a[i] <= '9') {
				sa = sa + (a[i] - '0')*t;
				t = t * 10;
			}
		}
		if (a[0] == '-') sa = -sa;
		for (int i = strlen(b) - 1,t=1;i >= 0;i--) {
			if (b[i] >= '0'&&b[i] <= '9') {
				sb = sb + (b[i] - '0')*t;
				t = t * 10;
			}
		}
		if (b[0] == '-') sb = -sb;
		cout << sa + sb<<"\n";
	}
}

问题 C: 特殊乘法

时间限制: 1 Sec 内存限制: 32 MB

题目描述
写个算法,对2个小于1000000000的输入,求结果。特殊乘法举例:123 * 45 = 14 +15 +24 +25 +34+35

输入
两个小于1000000000的数

输出
输入可能有多组数据,对于每一组数据,输出Input中的两个数按照题目要求的方法进行运算后得到的结果。

样例输入
24 65
42 66666
3 67

样例输出
66
180
39

#include<iostream>
using namespace std;
int main() {
	long a, b;
	while (cin >> a >> b) {
		long s = 0;
		while (a % 10 != 0) {
			int a0 = a % 10;
			a = a / 10;
			long bb = b;
			while (bb % 10 != 0) {
				int b0 = bb % 10;
				bb = bb / 10;
				s = s + a0 * b0;
			}
		}
		cout << s << "\n";
	}
}

问题 D: 比较奇偶数个数

时间限制: 1 Sec 内存限制: 32 MB

题目描述
第一行输入一个数,为n,第二行输入n个数,这n个数中,如果偶数比奇数多,输出NO,否则输出YES。

输入
输入有多组数据。
每组输入n,然后输入n个整数(1<=n<=1000)。

输出
如果偶数比奇数多,输出NO,否则输出YES。

样例输入
1
67
7
0 69 24 78 58 62 64

样例输出
YES
NO

#include<iostream>
using namespace std;
int main() {
	int n,a;
	while (cin >> n) {
		int o = 0, j = 0;
		for (int i = 0;i < n;i++) {
			cin >> a;
			if (a % 2 == 0) o++;
			else j++;
		}
		if (j > o) cout << "YES"<<"\n";
		else cout << "NO" << "\n";
	}
}

问题 F: A+B和C (15)

时间限制: 1 Sec 内存限制: 32 MB

题目描述
给定区间[-231, 231]内的3个整数A、B和C,请判断A+B是否大于C。

输入
输入第1行给出正整数T(<=10),是测试用例的个数。随后给出T组测试用例,每组占一行,顺序给出A、B和C。整数间以空格分隔。

输出
对每组测试用例,在一行中输出“Case #X: true”如果A+B>C,否则输出“Case #X: false”,其中X是测试用例的编号(从1开始)。

样例输入
4
1 2 3
2 3 4
2147483647 0 2147483646
0 -2147483648 -2147483647

样例输出
Case #1: false
Case #2: true
Case #3: true
Case #4: false

#include<iostream>
using namespace std;
int main() {
	long a[10] = { 0 }, b[10] = { 0 }, c[10] = { 0 };
	bool s[10] = { 0 };
	int t;
	cin >> t;
	for (int i = 0;i < t;i++) {
		cin >> a[i] >> b[i] >> c[i];
		if (a[i] + b[i] > c[i]) s[i] = 1;
		else s[i] = 0;
	}
	for (int i = 0;i < t;i++) {
		cout << "Case #" << i+1 << ": " <<boolalpha<< s[i]<<"\n";
	}
}

问题 G: 数字分类 (20)

时间限制: 1 Sec 内存限制: 32 MB

题目描述
给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:
A1 = 能被5整除的数字中所有偶数的和;
A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4…;
A3 = 被5除后余2的数字的个数;
A4 = 被5除后余3的数字的平均数,精确到小数点后1位;
A5 = 被5除后余4的数字中最大数字。

输入
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N,随后给出N个不超过1000的待分类的正整数。数字间以空格分隔。

输出
对给定的N个正整数,按题目要求计算A1~A5并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。
若其中某一类数字不存在,则在相应位置输出“N”。

样例输入
13 1 2 3 4 5 6 7 8 9 10 20 16 18
8 1 2 4 5 6 7 9 16

样例输出
30 11 2 9.7 9
N 11 2 N 9

//这个题判出来我只有91分???不知道哪里有问题。。。
#include<iostream>
#include<cmath>
using namespace std;
int main() {
	int N;
	int a;
	while (cin >> N) {
		int A1 = 0, A2 = 0, A3 = 0, A5 = 0;
		double A4 = 0, n = 0, j = 0;
		for (int i = 0;i < N;i++) {
			cin >> a;
			//A1
			if (a % 5 == 0 && a % 2 == 0) {
				A1 += a;
			}
			//A2
			if (a % 5 == 1) {
				A2 = A2 + pow(-1, j)*a;
				j++;
			}
			//A3
			if (a % 5 == 2) {
				A3++;
			}
			//A4
			if (a % 5 == 3) {
				A4 += a;
				n++;
			}
			//A5
			if (a % 5 == 4) {
				if(a>A5) A5 = a;
			}
		}
		if (A1 != 0) cout << A1 << " ";
		else cout << "N ";
		if (A2 != 0) cout << A2 << " ";
		else cout << "N ";
		if (A3 != 0) cout << A3 << " ";
		else cout << "N ";
		if (A4 != 0) {printf("%.1lf", A4 / n); printf(" ");}
		else cout << "N ";
		if (A5 != 0) cout << A5 << "\n";
		else cout << "N \n";
	}
}

问题 H: 部分A+B (15)

时间限制: 1 Sec 内存限制: 32 MB

题目描述
正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA。例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6。
现给定A、DA、B、DB,请编写程序计算PA + PB。

输入
输入在一行中依次给出A、DA、B、DB,中间以空格分隔,其中0 < A, B < 1010。

输出
在一行中输出PA + PB的值。

样例输入
3862767 6 13530293 3
3862767 1 13530293 8

样例输出
399
0

#include<iostream>
#include<cstring>
using namespace std;
int main() {
	long A, B, DA, DB;
//	int An = 0, Bn = 0;
	while (cin >> A >> DA >> B >> DB) {
		int PA = 0, PB = 0, n = 1, m = 1;
		while (A != 0) {
			int a = A % 10;
			if (a == DA) {
				PA += a * n;
				n *= 10;
			}
			A /= 10;
		}
		while (B != 0) {
			int b = B % 10;
			if (b == DB) {
				PB += b * m;
				m *= 10;
			}
			B /= 10;
		}
		cout << PA + PB << "\n";
	}

}

问题 I: 锤子剪刀布 (20)

时间限制: 1 Sec 内存限制: 32 MB

题目描述
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入
输入第1行给出正整数N(<=105),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C代表“锤子”、J代表“剪刀”、B代表“布”,第1个字母代表甲方,第2个代表乙方,中间有1个空格。

输出
输出第1、2行分别给出甲、乙的胜、平、负次数,数字间以1个空格分隔。第3行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有1个空格。如果解不唯一,则输出按字母序最小的解。

样例输入
10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J

样例输出
5 3 2
2 3 5
B B

#include<iostream>
#include<cstring>
using namespace std;
char max3(int a, int b, int c);
int main() {
	int n;
	cin >> n;
	char x, y;
	int xc = 0, xj = 0, xb = 0, yc = 0, yj = 0, yb = 0;
	int xs = 0, xp = 0, ys = 0;
	for (int i = 0;i < n;i++) {
		cin >> x >> y;
		//x胜
		if (x == 'C'&&y == 'J') {
			xc++;
			xs++;
		}
		if (x == 'J'&&y == 'B') {
			xj++;
			xs++;
		}
		if (x == 'B'&&y == 'C') {
			xb++;
			xs++;
		}
		//y胜
		if (y == 'C'&&x == 'J') {
			yc++;
			ys++;
		}
		if (y == 'J'&&x == 'B') {
			yj++;
			ys++;
		}
		if (y == 'B'&&x == 'C') {
			yb++;
			ys++;
		}
		//xy平
		if (x == y) {
			xp++;
		}
	}
	cout << xs << " " << xp << " " << n - xs - xp << endl;
	cout << ys << " " << xp << " " << n - ys - xp << endl;
	cout << max3(xc, xj, xb) << " " << max3(yc, yj, yb);
}

char max3(int a, int b, int c) {
	int m = a;
	if (b > m) m = b;
	if (c > m) m = c;
	if (m == c) return 'B';
	if (m == a) return 'C';
	if (m == b) return 'J';
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值