A 链表的合并
这道题目签到题,我还以为排序会超时,结果就30个数据,发一波归并排序的思路。
#include<bits/stdc++.h>
using namespace std;
int main() {
int a[21], b[21], c[105];
for(int i = 0; i < 15; ++i) {
scanf("%d", &a[i]);
}
for(int i = 0; i < 15; ++i) {
scanf("%d", &b[i]);
}
int i = 0, j = 0, cnt = 0;
while(i < 15 && j < 15) {
if(a[i] > b[j]) {
c[cnt++] = b[j++];
} else {
c[cnt++] = a[i++];
}
}
while(i < 15) c[cnt++] = a[i++];
while(j < 15) c[cnt++] = b[j++];
for(int i = 0; i < 30; ++i) {
printf("%d", c[i]);
if(i != 29) printf(" ");
else printf("\n");
}
return 0;
}
B 兑换零钱
DP
#include<bits/stdc++.h>
#define ll long long
const int mod = 1000000007;
using namespace std;
int money[] = {1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000};
int dp[100005];
int main() {
int T;
scanf("%d", &T);
while(T--) {
int n;
memset(dp, 0, sizeof(dp));
scanf("%d", &n);
dp[0] = 1;
for(int i = 0; i < 13; ++i) {
for(int j = money[i]; j <= n; ++j) {
dp[j] = (dp[j - money[i]] + dp[j]) % mod;
}
}
printf("%d\n", dp[n]);
}
return 0;
}
C 神奇的进制转换
任意进制转换模板
#include<iostream>
#include <cstring>
#include <string>
using namespace std;
string rev(string &s) { /*字符串逆序*/
int i;
string temp = "";
for (i = s.length() - 1; i >= 0; i--)
temp += s.at(i);
return temp;
}
int getNum(char str) {
int num;
if (isdigit(str))
num = str - '0';
else if (str >= 'A' && str <= 'Z')
num = str - 'A' + 10;
else
num = str - 'a' + 36;
return num;
}
char getChar(int num) {
char index[62] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a',
'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
};
return index[num];
}
/*分别表示被除数,除数,商、余数及被除数的进制*/
void Divide(string ÷nd, int to, string "ient, int *remainder,
int from) {
int i;
int flag = 0; /*用来判断最后的商是否全为0*/
int curDividend = 0; /*当前的被除数*/
quotient = "";
*remainder = 0;
for (i = 0; i < dividend.length(); i++) {
curDividend = (*remainder) * from + getNum(dividend.at(i));
if (curDividend < to) {
quotient += "0";
*remainder = curDividend;
} else {
quotient += getChar(curDividend / to);
*remainder = curDividend % to;
}
}
/*对商进行处理,去除前导0*/
for (i = 0; i < quotient.length(); i++) {
if (quotient.at(i) != '0') {
flag = 1;
quotient = quotient.erase(0, i);
/*删除从0开始的i个字符,返回新的字符串*/
break;
}
}
if (flag == 0)
quotient = "0";
}
/*分别表示原进制大数、转换结果、原进制及目标进制,仅限在62进制以内*/
void Change(string &a, string &b, int from, int to) {
int remainder;
string quotient;
b = "";
Divide(a, to, quotient, &remainder, from);
while (quotient.compare("0") != 0) {
b += getChar(remainder);
a = quotient;
Divide(a, to, quotient, &remainder, from);
}
b += getChar(remainder);
b = rev(b);
}
int main() {
int t, n, m;
string s, k;
scanf("%d", &t);
while(t--) {
cin >> n >> m >> s;
Change(s, k, n, m);
cout << k << endl;
}
}
D 最大的湖
简单dfs
#include<bits/stdc++.h>
#define ll long long
const int mod = 100;
const int MAX_N = 1000005;
using namespace std;
char maze[105][105];
int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};
int n, m, k;
int cnt;
void dfs(int x, int y) {
maze[x][y] = '0';
cnt += 1;
for(int i = 0; i < 4; ++i) {
int tx = dx[i] + x;
int ty = dy[i] + y;
if(tx >= 0 && tx < n && ty >= 0 && ty < m && maze[tx][ty] == '1') {
dfs(tx, ty);
}
}
}
int main() {
scanf("%d %d %d", &n, &m, &k);
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j)
maze[i][j] = '0';
}
for(int i = 0; i < k; ++i) {
int x, y;
scanf("%d %d", &x, &y);
maze[x - 1][y - 1] = '1';
}
int ans = -1;
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j) {
if(maze[i][j] == '1') {
cnt = 0;
dfs(i, j);
ans = max(ans, cnt);
}
}
}
printf("%d\n", ans);
return 0;
}
E 砝码和天平
进制转换
#include<bits/stdc++.h>
#define ll long long
const int mod = 100;
const int MAX_N = 1000005;
using namespace std;
int main() {
int T;
scanf("%d", &T);
while(T--) {
int w, m;
scanf("%d %d", &w, &m);
int carry = 0;
bool flag = true;
while(m) {
int t = m % w;
m /= w;
if(t + carry == 1 || t + carry == 0) {
carry = 0;
} else if(t + carry == w - 1 || t + carry == w) {
carry = 1;
} else {
flag = false;
break;
}
}
if(flag == true) printf("YES\n");
else printf("NO\n");
}
return 0;
}
F 得分
#include<bits/stdc++.h>
using namespace std;
int main() {
int T;
scanf("%d", &T);
while(T--) {
char st[1005];
scanf("%s", st);
int len = strlen(st), ans = 0, cnt = 0;
for(int i = 0; i < len; ++i) {
if(st[i] == 'O') {
ans += 1;
} else {
cnt += (1 + ans) * ans / 2;
ans = 0;
}
}
if(st[len - 1] == 'O') cnt += (1 + ans) * ans / 2;
printf("%d\n", cnt);
}
return 0;
}
G 0和5
被90整除的思路就是首先能被10整出就必须至少一个0,然后被9整除就是必须能被2个3整除,然后就能推出每位数相加之后要是45的倍数。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int a[1005];
int main() {
int n;
int Five = 0, Zero = 0;
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
if(a[i] == 0) Zero += 1;
else Five += 1;
}
if(Five / 9 > 0 && Zero > 0) {
for(int i = 0; i < Five / 9; ++i)
printf("555555555");
for(int i = 0; i < Zero; ++i)
printf("0");
} else if(Zero > 0) {
printf("0\n");
} else {
printf("-1\n");
}
return 0;
}