中南林业科技大学第十一届程序设计大赛

    xiaoxiao2025-04-14  54

    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; }

    E 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; }
    最新回复(0)