数组的排序
Description
对一个数组内的元素按绝对值从小到大排个序吧。
Input
第一行输入一个数n(1 <= n <= 50)
第二行有n个数字,这n个数中任意一个数k均满足(-100 <= k <= 100). 如果两个数绝对值相同但是符号相反,那么负的排在前面,正的排在后面。
Output
输出排序后的这n个数,每两个数之间以一个空格隔开。
Samples
input
5
4 6 -2 1 0
output
0 1 -2 4 6
点击查看代码
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
bool compareAbs(int a, int b) {
int fa = abs(a),fb=abs(b);
if (fa == fb ) {
return a < 0 && b>0;
}
return fa < fb;
}
int main() {
int n;
cin >> n;
int arr[51];
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
sort(arr, arr+n, compareAbs);
for (int i = 0; i < n; i++) {
cout << arr[i];
if (i < n - 1) {
cout << " ";
}
}
cout << endl;
return 0;
}
【C系列3.23】单总说:一道简单题5 (九九乘法表)
Description
画一个九九乘法表。一个式子内没有空格,式子间有一个空格,每行最后一个式子后没有空格。前4行是这样的:
11=1
21=2 22=4
31=3 32=6 33=9
41=4 42=8 43=12 44=16
Input
无
Output
不能说
Samples
Show after trying 4 times:
Hint
暴力打表不可取啊
点击查看代码
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
cout << i << "*" << j << "=" << i * j;
if (j != i) {
cout << " ";
}
}
cout << endl;
}
return 0;
}
【C系列6.2】数组训练之发红包
Description
今天是六一儿童节,zry表示特别开心,因为他抢到了很多红包,于是引起了公愤,大家要求他发红包,他答应了但是有个条件让大家猜下他会包多少的红包。如果有人猜中了,他就发,没有猜中就不发。
Input
第一行输入一个T,代表有T组测试样例。
每组测试样例第一行输入n(猜的人数,小于10^6),k(zry准备发的金额(int))。接下来输入n个数字。
Output
如果有人猜中输出”madan”;
如果没有人猜出则输出”why am I so diao”。
Samples
input
1
4 7
5 3 7 9
output
madan
点击查看代码
#include <iostream>
using namespace std;
int main() {
int T;
cin >> T;
while (T--) {
int n=0,k=0;
cin >> n >> k;
bool guessed[100000] = { false };
for (int i = 0; i < n; i++) {
int guess=0;
cin >> guess;
guessed[guess] = true;
}
if (guessed[k]) {
cout << "madan" << endl;
}
else {
cout << "why am I so diao" << endl;
}
}
return 0;
}
破解简单密码
Description
密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。哇哈哈.
接下来渊子要在密码之上再加一套密码,虽然简单但也安全。
假设老王原来一个BBS上的密码为zvbo941987,为了方便记忆,他通过一种算法把这个密码变换成YUANzi1987,这个密码是他的名字和出生年份,怎么忘都忘不了,而且可以明目张胆地放在显眼的地方而不被别人知道真正的密码。
他是这么变换的,大家都知道手机上的字母: 1--1, abc--2, def--3, ghi--4, jkl--5, mno--6, pqrs--7, tuv--8 wxyz--9, 0--0,就这么简单,老王把密码中出现的小写字母都变成对应的数字,数字和其他的符号都不做变换,声明:密码中没有空格,而密码中出现的大写字母则边成小写之后往后移一位,如:X,先边成小写,再往后移一位,不就是y了嘛,简单吧。记住,z往后移是a哦。
Input
输入包括多个测试数据。输入是一个明文,密码长度不超过100个字符,输入直到文件结尾。
Output
输出渊子真正的密文。
Samples
input
YUANzi1987
output
zvbo941987
点击查看代码
#include <iostream>
using namespace std;
int main() {
string plaintext;
while (cin >> plaintext) {
string password = "";
for (char ch : plaintext) {
if (ch >= 'a' && ch <= 'z') {
if (ch == 'a' || ch == 'b' || ch == 'c') password += '2';
else if (ch == 'd' || ch == 'e' || ch == 'f') password += '3';
else if (ch == 'g' || ch == 'h' || ch == 'i') password += '4';
else if (ch == 'j' || ch == 'k' || ch == 'l') password += '5';
else if (ch == 'm' || ch == 'n' || ch == 'o') password += '6';
else if (ch == 'p' || ch == 'q' || ch == 'r' || ch == 's') password += '7';
else if (ch == 't' || ch == 'u' || ch == 'v') password += '8';
else if (ch == 'w' || ch == 'x' || ch == 'y' || ch == 'z') password += '9';
}
else if (ch>='A'&&ch<='Z') {
char lower = tolower(ch);
char next = lower + 1;
if (next > 'z') {
next -= 26;
}
password += next;
}
else {
password += ch;
}
}
cout << password << endl;
}
return 0;
}
【C系列4.11】函数训练之爬楼梯
Description
cyn小朋友今天学会了如何爬楼梯,但她腿太短了,能走的步数不多,你能帮她算算他的走法总共有几种吗?假设有h个楼梯,一次只能走一步或者两步或者三步,求总共有几种不同的方法
Input
第一行输入一个整数T,代表有几组测试数据。
接下来每行输入一个整数h(less than 30),代表有几个楼梯。
Output
输出有几种方法。
Samples
input
3
10
20
30
output
274
121415
53798080
点击查看代码
#include <iostream>
using namespace std;
long long countWays(int h) {
if (h <= 2) return h;
if (h == 3) return 4;
long long dp[10000];
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
for (int i = 4; i <= h; i++) {
dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
}
return dp[h];
}
int main() {
int T;
cin >> T;
while (T--) {
int h;
cin >> h;
cout << countWays(h) << endl;
}
return 0;
}
【C系列综合1】游戏达人I (01背包问题)
Description
ACM队的ydw是个游戏的狂热爱好者,他喜好玩各种各样的单机游戏,以可以得到各种不同的结局通关为乐,但是由于时间有限(他还要出题TAT),于是他只能选择自己喜欢的几个结局来通关,由于ydw是游戏达人,因此他可以自己搞定所有的剧情而不去查攻略,但是由于自力更生,完成每个结局的时间是不同的,而他对每一个结局的喜好度也是不同的,即通关每个结局他获得的愉悦度是不同的。他希望在自己有限的时间内可以通关某些结局来使得自己的愉悦度最大。
Input
有多组测试数据,
第1行为N(0<N<=100)和T(0<T<=2000),表示ydw有N个游戏可以玩,玩游戏的总的时间为T。
接下来3*N行,每行第一个数字n(1<=n<=10)表示这个游戏有几种结局,接下来的一行n个数字表示通关某个结局ydw可以获得的愉悦度,再接下来一行的n个数字表示ydw通关某个结局需要的时间。
测试数据以0 0结尾。(数据保证愉悦度和时间均大于0,小于等于1000)
Output
ydw可以获得的最大愉悦度。
Samples
input
1 10
2
3 5
4 6
1 9
2
3 5
4 6
0 0
output
8
5
Hint
第1组数据中,ydw有10的时间去玩1个游戏,2个结局分别耗时为4和6,而愉悦度为3和5,刚好可以达到,则愉悦度为8。
第2组中,时间为9,只能玩1个结局,则最大为5。
点击查看代码
#include <stdio.h>
int w[1000] = { 0 };
int v[1000] = { 0 };
int f[1001][2001];
void qk(int w[], int v[], int f[][2001], int j, int l, int t) {
for (int i = 0; i < j; ++i) {
v[i] = 0;
}
for (int i = 0; i < l; ++i) {
w[i] = 0;
}
for (int i = 1; i < j; ++i) {
for (int k = 1; k <= t; ++k) {
f[i][k] = 0;
}
}
}
int main(void) {
int nn, n, t, j = 0, l = 0;
while (scanf("%d %d", &nn, &t) != EOF) {
if (nn == 0 && t == 0) break;
j = 1; l = 1;
while (nn--) {
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d", &v[j]); j++;
}
for (int i = 0; i < n; ++i) {
scanf("%d", &w[l]); l++;
}
}
for (int i = 1; i < j; ++i) {
for (int k = 1; k <= t; ++k) {
if (w[i] > k) f[i][k] = f[i - 1][k];
else f[i][k] = f[i - 1][k] > f[i - 1][k - w[i]] + v[i] ? f[i - 1][k] : f[i - 1][k - w[i]] + v[i];
}
}
printf("%d\n", f[j - 1][t]);
qk(w, v, f, j, l, t);
}
return 0;
}