一、害死人不偿命的(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';
}