├── .gitignore ├── L1-001 Hello World .cpp ├── L1-002 打印沙漏 .cpp ├── L1-003 个位数统计 .cpp ├── L1-004 计算摄氏温度 .cpp ├── L1-005 考试座位号 .cpp ├── L1-006 连续因子.cpp ├── L1-007 念数字.cpp ├── L1-008 求整数段和.cpp ├── L1-009 N个数求和.cpp ├── L1-010 比较大小.cpp ├── L1-011 A-B.cpp ├── L1-012 计算指数.cpp ├── L1-013 计算阶乘和.cpp ├── L1-014 简单题.cpp ├── L1-015 跟奥巴马一起画方块.cpp ├── L1-016 查验身份证.cpp ├── L1-017 到底有多二.cpp ├── L1-018 大笨钟.cpp ├── L1-019 谁先倒.cpp ├── L1-020 帅到没朋友.cpp ├── L1-021 重要的话说三遍.cpp ├── L1-022 奇偶分家.cpp ├── L1-023 输出GPLT.cpp ├── L1-024 后天.cpp ├── L1-025 正整数A+B.cpp ├── L1-026 I Love GPLT.cpp ├── L1-027 出租.cpp ├── L1-028 判断素数.cpp ├── L1-029 是不是太胖了.cpp ├── L1-030 一帮一.cpp ├── L1-031 到底是不是太胖了.cpp ├── L1-032 Left-pad.cpp ├── L1-033 出生年.cpp ├── L1-034 点赞.cpp ├── L1-035 情人节.cpp ├── L1-036 A乘以B.cpp ├── L1-037 A除以B.cpp ├── L1-038 新世界.cpp ├── L1-039 古风排版.cpp ├── L1-040 最佳情侣身高差.cpp ├── L1-041 寻找250.cpp ├── L1-042 日期格式化.cpp ├── L1-043 阅览室.cpp ├── L1-044 稳赢.cpp ├── L1-045 宇宙无敌大招呼.cpp ├── L1-046 整除光棍.cpp ├── L1-047 装睡.cpp ├── L1-048 矩阵A乘以B.cpp ├── L1-049 天梯赛座位分配.cpp ├── L1-050 倒数第N个字符串.cpp ├── L1-051 打折.cpp ├── L1-052 2018我们要赢.cpp ├── L1-053 电子汪.cpp ├── L1-054 福到了.cpp ├── L1-055 谁是赢家.cpp ├── L1-056 猜数字.cpp ├── L1-057 PTA使我精神焕发.cpp ├── L1-058 6翻了.cpp ├── L1-059 敲笨钟.cpp ├── L1-060 心理阴影面积.cpp ├── L1-061 新胖子公式.cpp ├── L1-062 幸运彩票.cpp ├── L1-063 吃鱼还是吃肉.cpp ├── L1-064 估值一亿的AI核心代码.cpp ├── L1-065 嫑废话上代码.cpp ├── L1-066 猫是液体.cpp ├── L1-067 洛希极限.cpp ├── L1-068 调和平均.cpp ├── L1-069 胎压监测.cpp ├── L1-070 吃火锅.cpp ├── L1-071 前世档案.cpp ├── L1-072 刮刮彩票.cpp ├── L1-073 人与神.cpp ├── L1-074 两个小时学完C语言.cpp ├── L1-075 强迫症.cpp ├── L1-076 降价提醒机器人.cpp ├── L1-077 大笨钟的心情.cpp ├── L1-078 吉老师的回归.cpp ├── L1-079 天梯赛的善良.cpp ├── L1-080 乘法口诀数列.cpp ├── L1-081 今天我要赢.cpp ├── L1-082 种钻石.cpp ├── L1-083 谁能进图书馆.cpp ├── L1-084 拯救外星人.cpp ├── L1-085 试试手气.cpp ├── L1-086 斯德哥尔摩火车上的题.cpp ├── L1-087 机工士姆斯塔迪奥.cpp ├── L1-088 静静的推荐.cpp ├── L1-089 最好的文档.cpp ├── L1-090 什么是机器学习.cpp ├── L1-091 程序员买包子.cpp ├── L1-092 进化论.cpp ├── L1-093 猜帽子游戏.cpp ├── L1-094 剪切粘贴.cpp ├── L1-095 分寝室.cpp ├── L1-096 谁管谁叫爹.cpp ├── L2-001 紧急救援 .cpp ├── L2-002 链表去重.cpp ├── L2-003 月饼 .cpp ├── L2-004 这是二叉搜索树吗?.cpp ├── L2-005 集合相似度.cpp ├── L2-006 树的遍历.cpp ├── L2-007 家庭房产.cpp ├── L2-008 最长对称子串.cpp ├── L2-009 抢红包.cpp ├── L2-010 排座位.cpp ├── L2-011 玩转二叉树.cpp ├── L2-012 关于堆的判断 .cpp ├── L2-013 红色警报.cpp ├── L2-014 列车调度.cpp ├── L2-015 互评成绩.cpp ├── L2-016 愿天下有情人都是失散多年的兄妹 .cpp ├── L2-017 人以群分.cpp ├── L2-018 多项式A除以B.cpp ├── L2-019 悄悄关注.cpp ├── L2-020 功夫传人.cpp ├── L2-021 点赞狂魔.cpp ├── L2-022 重排链表.cpp ├── L2-023 图着色问题.cpp ├── L2-024 部落.cpp ├── L2-025 分而治之.cpp ├── L2-026 小字辈.cpp ├── L2-027 名人堂与代金券.cpp ├── L2-028 秀恩爱分得快.cpp ├── L2-029 特立独行的幸福.cpp ├── L2-030 冰岛人.cpp ├── L2-031 深入虎穴.cpp ├── L2-032 彩虹瓶.cpp ├── L2-033 简单计算器.cpp ├── L2-034 口罩发放.cpp ├── L2-035 完全二叉树的层序遍历.cpp ├── L2-036 网红点打卡攻略.cpp ├── L2-037 包装机.cpp ├── L2-038 病毒溯源.cpp ├── L2-039 清点代码库.cpp ├── L2-040 哲哲打游戏.cpp ├── L2-041 插松枝.cpp ├── L2-042 老板的作息表.cpp ├── L2-043 龙龙送外卖.cpp ├── L2-044 大众情人.cpp ├── L2-045 堆宝塔.cpp ├── L2-046 天梯赛的赛场安排.cpp ├── L2-047 锦标赛.cpp ├── L2-048 寻宝图.cpp ├── L3-001 凑零钱.cpp ├── L3-002 堆栈.cpp ├── L3-003 社交集群.cpp ├── L3-004 肿瘤诊断.cpp ├── L3-005 垃圾箱分布.cpp ├── L3-006 迎风一刀斩.cpp ├── L3-007 天梯地图 .cpp ├── L3-008 喊山 .cpp ├── L3-009 长城.cpp ├── L3-010 是否完全二叉搜索树.cpp ├── L3-011 直捣黄龙.cpp ├── L3-012 水果忍者.cpp ├── L3-013 非常弹的球.cpp ├── L3-014 周游世界.cpp ├── L3-015 球队“食物链”.cpp ├── L3-016 二叉搜索树的结构.cpp ├── L3-017 森森快递.cpp ├── L3-019 代码排版.cpp ├── L3-020 至多删三个字符.cpp ├── L3-021 神坛.cpp ├── L3-022 地铁一日游.cpp ├── L3-023 计算图.cpp ├── L3-025 那就别担心了.cpp ├── L3-028 森森旅游.cpp └── L3-029 还原文件.cpp /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /L1-001 Hello World .cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | cout << "Hello World!"; 5 | return 0; 6 | } -------------------------------------------------------------------------------- /L1-002 打印沙漏 .cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | int N, row = 0; 5 | char c; 6 | cin >> N >> c; 7 | for (int i = 0; i < N; i++) { 8 | if ((2 * i * (i + 2) + 1) > N) { 9 | row = i - 1; 10 | break; 11 | } 12 | } 13 | for (int i = row; i >= 1; i--) { 14 | for (int k = row - i; k >= 1; k--) cout << " "; 15 | for (int j = i * 2 + 1; j >= 1; j--) cout << c; 16 | cout << endl; 17 | } 18 | for (int i = 0; i < row; i++) cout << " "; 19 | cout << c << endl; 20 | for (int i = 1; i <= row; i++) { 21 | for (int k = row - i; k >= 1; k--) cout << " "; 22 | for (int j = i * 2 + 1; j >= 1; j--) cout << c; 23 | cout << endl; 24 | } 25 | cout << (N - (2 * row * (row + 2) + 1)); 26 | return 0; 27 | } -------------------------------------------------------------------------------- /L1-003 个位数统计 .cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() { 5 | string s; 6 | cin >> s; 7 | int len = s.length(); 8 | int a[10] = {0}; 9 | for (int i = 0; i < len; i++) a[s[i] - '0']++; 10 | for (int i = 0; i < 10; i++) { 11 | if (a[i] != 0) cout << i << ":" << a[i] << endl; 12 | } 13 | return 0; 14 | } -------------------------------------------------------------------------------- /L1-004 计算摄氏温度 .cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | int f; 5 | cin >> f; 6 | int c = 5 * (f - 32) / 9; 7 | cout << "Celsius = " << c; 8 | return 0; 9 | } -------------------------------------------------------------------------------- /L1-005 考试座位号 .cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | struct stu { 5 | string s; 6 | int one, two; 7 | }; 8 | int main() { 9 | int n, m, temp; 10 | cin >> n; 11 | vector a(n); 12 | for (int i = 0; i < n; i++) { 13 | cin >> a[i].s >> a[i].one >> a[i].two; 14 | } 15 | cin >> m; 16 | for (int i = 0; i < m; i++) { 17 | cin >> temp; 18 | for (int j = 0; j < n; j++) { 19 | if (a[j].one == temp) { 20 | cout << a[j].s << " " << a[j].two << endl; 21 | break; 22 | } 23 | } 24 | } 25 | return 0; 26 | } -------------------------------------------------------------------------------- /L1-006 连续因子.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | long int num, temp; 5 | int main(){ 6 | cin >> num; 7 | int first = 0, len = 0, maxn = sqrt(num) + 1; 8 | for (int i = 2; i <= maxn; i++) { 9 | int j; 10 | temp = 1; 11 | for (j = i; j <= maxn; j++) { 12 | temp *= j; 13 | if (num % temp != 0) break; 14 | } 15 | if (j - i > len) { 16 | len = j - i; 17 | first = i; 18 | } 19 | } 20 | if (first == 0) { 21 | cout << 1 << endl << num; 22 | } else { 23 | cout << len << endl; 24 | for (int i = 0; i < len; i++) { 25 | cout << first + i; 26 | if (i != len - 1) cout << '*'; 27 | } 28 | } 29 | return 0; 30 | } -------------------------------------------------------------------------------- /L1-007 念数字.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | string chinese[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"}; 5 | string s; 6 | cin >> s; 7 | int len = s.length(); 8 | int flag = s[0] == '-' ? 1 : 0; 9 | if(flag == 1) cout << "fu"; 10 | for(int i = flag; i < len; i++) { 11 | if(i == 0) { 12 | cout << chinese[s[i] - '0']; 13 | continue; 14 | } 15 | cout << " " << chinese[s[i] - '0']; 16 | } 17 | return 0; 18 | } -------------------------------------------------------------------------------- /L1-008 求整数段和.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() { 5 | int a, b; 6 | cin >> a >> b; 7 | int temp = a, sum = 0; 8 | while(temp <= b) { 9 | for(int j = 0; j < 5 && temp <= b; j++) { 10 | printf("%5d", temp); 11 | sum += temp; 12 | temp++; 13 | } 14 | cout << endl; 15 | } 16 | cout << "Sum = " << sum; 17 | return 0; 18 | } -------------------------------------------------------------------------------- /L1-009 N个数求和.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | long long gcd(long long a, long long b) {return b == 0 ? a : gcd(b, a % b);} 5 | int main() { 6 | long long n, a, b, suma = 0, sumb = 1, gcdvalue; 7 | scanf("%lld", &n); 8 | for(int i = 0; i < n; i++) { 9 | scanf("%lld/%lld", &a, &b); 10 | gcdvalue = (suma == 0 || sumb == 0) ? 1 : gcd(abs(suma), abs(sumb)); 11 | sumb = sumb / gcdvalue; 12 | suma = suma / gcdvalue; 13 | gcdvalue = (a == 0 || b == 0) ? 1 : gcd(abs(a), abs(b)); 14 | a = a / gcdvalue; 15 | b = b / gcdvalue; 16 | suma = a * sumb + suma * b; 17 | sumb = b * sumb; 18 | } 19 | long long integer = suma / sumb; 20 | suma = suma - (sumb * integer); 21 | gcdvalue = (suma == 0 || sumb == 0) ? 1 : gcd(abs(suma), abs(sumb)); 22 | suma = suma / gcdvalue; 23 | sumb = sumb / gcdvalue; 24 | if(integer != 0) { 25 | printf("%lld", integer); 26 | if(suma != 0) 27 | printf(" "); 28 | } 29 | if(suma != 0) { 30 | printf("%lld/%lld", suma, sumb); 31 | } 32 | if(integer == 0 && suma == 0) 33 | printf("0"); 34 | return 0; 35 | } -------------------------------------------------------------------------------- /L1-010 比较大小.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | int a, b, c; 5 | cin >> a >> b >> c; 6 | if(b > c) swap(b, c); 7 | if(a > b) swap(a, b); 8 | if(b > c) swap(b, c); 9 | cout << a << "->" << b << "->" << c; 10 | return 0; 11 | } -------------------------------------------------------------------------------- /L1-011 A-B.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int book[256]; 4 | int main() { 5 | string s, a; 6 | getline(cin, s); 7 | getline(cin, a); 8 | for(int i = 0; i < a.length(); i++) book[a[i]] = 1; 9 | for(int i = 0; i < s.length(); i++) { 10 | if(book[s[i]] == 1) continue; 11 | cout << s[i]; 12 | } 13 | return 0; 14 | } -------------------------------------------------------------------------------- /L1-012 计算指数.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() { 5 | int n; 6 | cin >> n; 7 | cout << "2^" << n << " = "<< pow(2, n); 8 | return 0; 9 | } -------------------------------------------------------------------------------- /L1-013 计算阶乘和.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | int n, ans = 0; 5 | cin >> n; 6 | for(int i = 1; i <= n; i++) { 7 | int temp = 1; 8 | for(int j = 1; j <= i; j++) temp *= j; 9 | ans += temp; 10 | } 11 | cout << ans; 12 | return 0; 13 | } -------------------------------------------------------------------------------- /L1-014 简单题.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | cout << "This is a simple problem."; 5 | return 0; 6 | } -------------------------------------------------------------------------------- /L1-015 跟奥巴马一起画方块.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | int N; 5 | cin >> N; 6 | char c; 7 | cin >> c; 8 | int t = N / 2 + N % 2; 9 | for (int i = 0; i < t - 1; i++) { 10 | for (int k = 0; k < N; k++) 11 | cout << c; 12 | cout << endl; 13 | } 14 | for (int i = 0; i < N; i++) 15 | cout << c; 16 | return 0; 17 | } -------------------------------------------------------------------------------- /L1-016 查验身份证.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | bool func(string a); 5 | int main() { 6 | int n, count = 0; 7 | cin >> n; 8 | for (int i = 0; i < n; i++) { 9 | string a; 10 | cin >> a; 11 | if (func(a)) count++; 12 | } 13 | if (count == 0) cout << "All passed"; 14 | return 0; 15 | } 16 | bool func(string s) { 17 | int sum = 0, a[18]; 18 | for (int i = 0; i < 17; i++) 19 | a[i] = s[i] - '0'; 20 | if (s[17] == 'X') a[17] = 10; 21 | else 22 | a[17] = s[17] - '0'; 23 | int b[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; 24 | for (int i = 0; i < 17; i++) 25 | sum = sum + a[i] * b[i]; 26 | sum = sum % 11; 27 | int c[11] = {1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2}; 28 | if (c[sum] != a[17]) { 29 | for (int i = 0; i < 17; i++) 30 | cout << s[i]; 31 | if (a[17] != 10) 32 | cout << a[17] << endl; 33 | else 34 | cout << "X" << endl; 35 | return true; 36 | } 37 | return false; 38 | } -------------------------------------------------------------------------------- /L1-017 到底有多二.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() { 5 | string s; 6 | cin >> s; 7 | int flag = (s[0] == '-' ? 1 : 0); 8 | int len = s.length(); 9 | int bit = len - flag, cnt = 0; 10 | for(int i = 0; i < len; i++) { 11 | if(s[i] == '2') cnt++; 12 | } 13 | double ans = (double)cnt / bit * 100; 14 | if(flag == 1) ans = ans * 1.5; 15 | if((s[len-1] - '0') % 2 == 0) ans = ans * 2; 16 | printf("%.2f%%", ans); 17 | return 0; 18 | } -------------------------------------------------------------------------------- /L1-018 大笨钟.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() { 5 | int hour, min; 6 | scanf("%d:%d", &hour, &min); 7 | if(hour <= 12) { 8 | printf("Only %02d:%02d. Too early to Dang.", hour, min); 9 | } else { 10 | hour -= 12; 11 | for(int i = 0; i < hour; i++) 12 | cout << "Dang"; 13 | if(min > 0) 14 | cout << "Dang"; 15 | } 16 | return 0; 17 | } -------------------------------------------------------------------------------- /L1-019 谁先倒.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | int jia, yi, n; 5 | cin >> jia >> yi >> n; 6 | int cnta = jia, cntb = yi; 7 | int jiahan, jiahua, yihan, yihua; 8 | for (int i = 0; i < n; i++) { 9 | cin >> jiahan >> jiahua >> yihan >> yihua; 10 | if (jiahan + yihan == jiahua && yihan + jiahan != yihua) 11 | cnta--; 12 | if (jiahan + yihan != jiahua && yihan + jiahan == yihua) 13 | cntb--; 14 | if(cnta == -1) { 15 | cout << "A" << endl << yi - cntb; 16 | break; 17 | } 18 | if(cntb == -1) { 19 | cout << "B" << endl << jia - cnta; 20 | break; 21 | } 22 | } 23 | return 0; 24 | } -------------------------------------------------------------------------------- /L1-020 帅到没朋友.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() { 5 | int a, b, c; 6 | cin >> a; 7 | set s, ans; 8 | string str; 9 | for(int i = 0; i < a; i++) { 10 | cin >> b; 11 | if(b >= 2) { 12 | for(int j = 0; j < b; j++) { 13 | cin >> str; 14 | s.insert(str); 15 | } 16 | } else { 17 | cin >> str; 18 | } 19 | } 20 | cin >> c; 21 | int flag = 0; 22 | for(int i = 0; i < c; i++) { 23 | cin >> str; 24 | if(s.find(str) == s.end() && ans.find(str) == ans.end()) { 25 | ans.insert(str); 26 | if(flag == 1) 27 | cout << " "; 28 | cout << str; 29 | flag = 1; 30 | } 31 | } 32 | if(flag == 0) 33 | cout << "No one is handsome"; 34 | return 0; 35 | } -------------------------------------------------------------------------------- /L1-021 重要的话说三遍.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | cout << "I'm gonna WIN!\nI'm gonna WIN!\nI'm gonna WIN!"; 5 | return 0; 6 | } -------------------------------------------------------------------------------- /L1-022 奇偶分家.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | int n, cnta = 0, cntb = 0; 5 | cin >> n; 6 | for(int i = 0; i < n; i++) { 7 | int temp; 8 | cin >> temp; 9 | if(temp % 2 == 0) 10 | cntb++; 11 | else 12 | cnta++; 13 | } 14 | cout << cnta << " " << cntb; 15 | return 0; 16 | } -------------------------------------------------------------------------------- /L1-023 输出GPLT.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int c[4]; 4 | using namespace std; 5 | int main() { 6 | string s; 7 | cin >> s; 8 | for(int i = 0; i < s.length(); i++) { 9 | if(toupper(s[i]) == 'G') { 10 | c[0]++; 11 | } else if(toupper(s[i]) == 'P') { 12 | c[1]++; 13 | } else if(toupper(s[i]) == 'L') { 14 | c[2]++; 15 | } else if(toupper(s[i]) == 'T') { 16 | c[3]++; 17 | } 18 | } 19 | while(c[0] != 0 || c[1] != 0 || c[2] != 0 || c[3] != 0) { 20 | for(int i = 0; i < 4; i++) { 21 | if(c[i] != 0) { 22 | c[i]--; 23 | if(i == 0) 24 | cout << "G"; 25 | else if(i == 1) 26 | cout << "P"; 27 | else if(i == 2) 28 | cout << "L"; 29 | else 30 | cout << "T"; 31 | } 32 | } 33 | } 34 | return 0; 35 | } -------------------------------------------------------------------------------- /L1-024 后天.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | int a; 5 | cin >> a; 6 | int b = (a + 2 > 7) ? (a - 5) : (a + 2); 7 | cout << b; 8 | return 0; 9 | } -------------------------------------------------------------------------------- /L1-025 正整数A+B.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | bool islegal(string s) { 5 | if(s.length() == 0) 6 | return false; 7 | for(int i = 0; i < s.length(); i++) { 8 | if(!isdigit(s[i])) return false; 9 | } 10 | int temp = stoi(s); 11 | if(temp < 1 || temp > 1000) return false; 12 | return true; 13 | } 14 | int main() { 15 | string a, b; 16 | string t; 17 | getline(cin, t); 18 | for(int i = 0; i < t.length(); i++) { 19 | if(t[i] == ' ') { 20 | a = t.substr(0, i); 21 | b = t.substr(i + 1, t.size()- i - 1); 22 | break; 23 | } 24 | } 25 | if(!islegal(a)) a = "?"; 26 | if(!islegal(b)) b = "?"; 27 | cout << a << " + " << b << " = "; 28 | if(a != "?" && b != "?") { 29 | int atemp = stoi(a), btemp = stoi(b); 30 | cout << atemp + btemp; 31 | } else { 32 | cout << "?"; 33 | } 34 | return 0; 35 | } -------------------------------------------------------------------------------- /L1-026 I Love GPLT.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | string s = "I Love GPLT"; 5 | for(int i = 0; i < s.length(); i++) { 6 | cout << s[i] << endl; 7 | } 8 | return 0; 9 | } -------------------------------------------------------------------------------- /L1-027 出租.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() { 5 | string s; 6 | cin >> s; 7 | int a[10] = {0}; 8 | for(int i = 0; i < 11; i++) { 9 | a[s[i] - '0']++; 10 | } 11 | vector arr; 12 | for(int i = 9; i >= 0; i--) { 13 | if(a[i] != 0) { 14 | arr.push_back(i); 15 | } 16 | } 17 | vector index; 18 | for(int i = 0; i < 11; i++) { 19 | for(int j = 0; j < arr.size(); j++) { 20 | if((s[i] - '0') == arr[j]) { 21 | index.push_back(j); 22 | } 23 | } 24 | } 25 | cout << "int[] arr = new int[]{" << arr[0]; 26 | for(int i = 1; i < arr.size(); i++) { 27 | cout << "," << arr[i]; 28 | } 29 | cout << "};" << endl << "int[] index = new int[]{" << index[0]; 30 | for(int i = 1; i < index.size(); i++) { 31 | cout << "," << index[i]; 32 | } 33 | cout << "};"; 34 | return 0; 35 | } -------------------------------------------------------------------------------- /L1-028 判断素数.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | bool isprime(int a) { 5 | if (a == 1) return false; 6 | for (int i = 2; i <= sqrt(a); i++) { 7 | if (a % i == 0) return false; 8 | } 9 | return true; 10 | } 11 | int main() { 12 | int n; 13 | cin >> n; 14 | for (int i = 0; i < n; i++) { 15 | int temp; 16 | cin >> temp; 17 | if (isprime(temp)) 18 | cout << "Yes" << endl; 19 | else 20 | cout << "No" << endl; 21 | } 22 | return 0; 23 | } -------------------------------------------------------------------------------- /L1-029 是不是太胖了.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | float height; 5 | cin >> height; 6 | float ans = (height - 100) * 0.9 * 2; 7 | printf("%.1f", ans); 8 | return 0; 9 | } -------------------------------------------------------------------------------- /L1-030 一帮一.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | struct node { 5 | int a; 6 | string s; 7 | }; 8 | int main() { 9 | int n; 10 | cin >> n; 11 | vector stu; 12 | for(int i = 0; i < n; i++) { 13 | node temp; 14 | cin >> temp.a >> temp.s; 15 | stu.push_back(temp); 16 | } 17 | int j = n - 1, k = n - 1; 18 | for(int i = 0; i < n/2; i++) { 19 | if(stu[i].a == 1) { 20 | while(stu[j].a == stu[i].a) j--; 21 | cout << stu[i].s << " " << stu[j].s << endl; 22 | j--; 23 | } else { 24 | while(stu[k].a == stu[i].a) k--; 25 | cout << stu[i].s << " " << stu[k].s << endl; 26 | k--; 27 | } 28 | } 29 | return 0; 30 | } -------------------------------------------------------------------------------- /L1-031 到底是不是太胖了.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() { 5 | int n; 6 | cin >> n; 7 | for(int i = 0; i < n; i++) { 8 | float height, weight; 9 | cin >> height >> weight; 10 | float stan = (height - 100) * 0.9 * 2; 11 | if(abs(stan - weight) < stan * 0.1) { 12 | cout << "You are wan mei!" << endl; 13 | } else if(stan > weight) { 14 | cout << "You are tai shou le!" << endl; 15 | } else { 16 | cout << "You are tai pang le!" << endl; 17 | } 18 | } 19 | return 0; 20 | } -------------------------------------------------------------------------------- /L1-032 Left-pad.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() { 5 | int cnt; 6 | char c; 7 | string s; 8 | cin >> cnt >> c; 9 | getchar(); 10 | getline(cin, s); 11 | int len = s.length(); 12 | if(len >= cnt) { 13 | cout << s.substr(s.size() - cnt); 14 | } else { 15 | for(int i = 0; i < cnt - len; i++) { 16 | cout << c; 17 | } 18 | cout << s; 19 | } 20 | return 0; 21 | } -------------------------------------------------------------------------------- /L1-033 出生年.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() { 5 | int y, n; 6 | scanf("%d%d", &y, &n); 7 | for (int i = y; i <= 3012; i++) { 8 | set s; 9 | int num = i; 10 | for (int j = 0; j < 4; j++) { 11 | s.insert(num % 10); 12 | num /= 10; 13 | } 14 | if (s.size() == n) { 15 | printf("%d %04d", i - y, i); 16 | break; 17 | } 18 | } 19 | return 0; 20 | } -------------------------------------------------------------------------------- /L1-034 点赞.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | int n, k, num, maxIndex = 0, maxValue = 0; 5 | scanf("%d", &n); 6 | int arr[1001] = {0}; 7 | for (int i = 0; i < n; i++) { 8 | scanf("%d", &k); 9 | for (int j = 0; j < k; j++) { 10 | scanf("%d", &num); 11 | arr[num]++; 12 | } 13 | } 14 | for (int i = 0; i < 1001; i++) { 15 | if (arr[i] >= maxValue) { 16 | maxValue = arr[i]; 17 | maxIndex = i; 18 | } 19 | } 20 | printf("%d %d", maxIndex, maxValue); 21 | return 0; 22 | } -------------------------------------------------------------------------------- /L1-035 情人节.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | string a, b, str; 5 | int cnt = 0; 6 | while(cin >> str) { 7 | if (str == ".") break; 8 | cnt++; 9 | if (cnt == 2) a = str; 10 | if (cnt == 14) b = str; 11 | } 12 | if (cnt >= 14) 13 | cout << a << " and " << b << " are inviting you to dinner..."; 14 | else if (cnt <= 1) 15 | cout << "Momo... No one is for you ..."; 16 | else 17 | cout << a << " is the only one for you..."; 18 | return 0; 19 | } -------------------------------------------------------------------------------- /L1-036 A乘以B.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | int a, b; 5 | cin >> a >> b; 6 | cout << a * b; 7 | return 0; 8 | } -------------------------------------------------------------------------------- /L1-037 A除以B.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | int a, b; 5 | scanf("%d%d", &a, &b); 6 | printf("%d/", a); 7 | if (b >= 0) 8 | printf("%d=", b); 9 | else 10 | printf("(%d)=", b); 11 | if (b == 0) 12 | printf("Error"); 13 | else 14 | printf("%.2f", a * 1.0 / b); 15 | return 0; 16 | } -------------------------------------------------------------------------------- /L1-038 新世界.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main() { 3 | printf("Hello World\nHello New World"); 4 | return 0; 5 | } -------------------------------------------------------------------------------- /L1-039 古风排版.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() { 5 | int n; 6 | string s; 7 | cin >> n; 8 | getchar(); 9 | getline(cin, s); 10 | int col = (s.length() - 1) / n + 1; 11 | vector > v(n, vector(col, ' ')); 12 | int index = 0; 13 | for (int j = col - 1; j >= 0; j--) { 14 | for (int i = 0; i < n; i++) { 15 | if (index < s.length()) 16 | v[i][j] = s[index++]; 17 | } 18 | } 19 | for (int i = 0; i < n; i++) { 20 | for (int j = 0; j < col; j++) 21 | cout << v[i][j]; 22 | cout << endl; 23 | } 24 | return 0; 25 | } -------------------------------------------------------------------------------- /L1-040 最佳情侣身高差.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main() { 3 | int n; 4 | scanf("%d", &n); 5 | for (int i = 0; i < n; i++) { 6 | char c; 7 | float height; 8 | scanf("\n%c %f", &c, &height); 9 | if (c == 'M') 10 | printf("%.2f\n", height * 1.0 / 1.09); 11 | else 12 | printf("%.2f\n", height * 1.09); 13 | } 14 | return 0; 15 | } -------------------------------------------------------------------------------- /L1-041 寻找250.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | int num, cnt = 0; 5 | while(cin >> num) { 6 | cnt++; 7 | if(num == 250) { 8 | cout << cnt; 9 | break; 10 | } 11 | } 12 | return 0; 13 | } 14 | -------------------------------------------------------------------------------- /L1-042 日期格式化.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | int a, b, c; 5 | char ch; 6 | cin >> a >> ch >> b >> ch >> c; 7 | printf("%d-%02d-%02d",c ,a, b); 8 | return 0; 9 | } -------------------------------------------------------------------------------- /L1-043 阅览室.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() { 5 | int n; 6 | cin >> n; 7 | int id, h, m, cnt = 0, sum = 0, isborr[1010] = {0}, time[1010] = {0}; 8 | char type, temp; 9 | for(int day = 0; day < n; ) { 10 | cin >> id >> type >> h >> temp >> m; 11 | if(id == 0) { 12 | if(cnt == 0) 13 | printf("0 0\n"); 14 | else 15 | printf("%d %d\n", cnt, (int)(1.0 * sum / cnt + 0.5)); 16 | day++; 17 | cnt = sum = 0; 18 | memset(isborr, 0, sizeof(isborr)); 19 | }else if(type == 'S') { 20 | isborr[id] = 1; 21 | time[id] = h * 60 + m; 22 | }else if(type == 'E' && isborr[id] == 1) { 23 | isborr[id] = 0; 24 | sum += h * 60 + m - time[id]; 25 | cnt++; 26 | } 27 | } 28 | return 0; 29 | } -------------------------------------------------------------------------------- /L1-044 稳赢.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() { 5 | map m; 6 | m["Bu"] = "JianDao"; 7 | m["JianDao"] = "ChuiZi"; 8 | m["ChuiZi"] = "Bu"; 9 | int k, cnt = 0; 10 | string s; 11 | cin >> k; 12 | while(cin >> s) { 13 | if(s == "End") return 0; 14 | cnt++; 15 | if(cnt % (k + 1) == 0) 16 | cout << s << endl; 17 | else 18 | cout << m[s] << endl; 19 | } 20 | return 0; 21 | } 22 | -------------------------------------------------------------------------------- /L1-045 宇宙无敌大招呼.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | string s; 5 | cin >> s; 6 | cout << "Hello " << s; 7 | return 0; 8 | } -------------------------------------------------------------------------------- /L1-046 整除光棍.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | int n, ans = 1, cnt = 1; 5 | cin >> n; 6 | while (ans < n) { 7 | ans = ans * 10 + 1; 8 | cnt++; 9 | } 10 | while(1){ 11 | cout << ans / n; 12 | if(ans % n == 0) break; 13 | ans = (ans % n) * 10 + 1; 14 | cnt++; 15 | } 16 | cout << ' ' << cnt; 17 | return 0; 18 | } 19 | 20 | -------------------------------------------------------------------------------- /L1-047 装睡.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | int n, heart, impluse; 5 | string name; 6 | cin >> n; 7 | for(int i = 0; i < n; i++) { 8 | cin >> name >> heart >> impluse; 9 | if(heart < 15 || heart > 20 || impluse < 50 || impluse > 70) 10 | cout << name << endl; 11 | } 12 | return 0; 13 | } -------------------------------------------------------------------------------- /L1-048 矩阵A乘以B.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int a[110][110], b[110][110]; 4 | int ra, ca, rb, cb; 5 | int f(int r, int c) { 6 | int sum = 0; 7 | for(int i = 1; i <= ca; i++) 8 | sum += a[r][i] * b[i][c]; 9 | return sum; 10 | } 11 | int main() { 12 | cin >> ra >> ca; 13 | for(int i = 1; i <= ra; i++) 14 | for(int j = 1; j <= ca; j++) 15 | cin >> a[i][j]; 16 | cin >> rb >> cb; 17 | for(int i = 1; i <= rb; i++) 18 | for(int j = 1; j <= cb; j++) 19 | cin >> b[i][j]; 20 | if(ca != rb) 21 | printf("Error: %d != %d", ca, rb); 22 | else { 23 | printf("%d %d\n", ra, cb); 24 | for(int i = 1; i <= ra; i++) { 25 | for(int j = 1; j <= cb; j++) { 26 | if(j != 1) cout << ' '; 27 | cout << f(i,j); 28 | } 29 | cout << endl; 30 | } 31 | } 32 | return 0; 33 | } 34 | 35 | -------------------------------------------------------------------------------- /L1-049 天梯赛座位分配.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() { 5 | int n, sum = 0, cnt = 1, num[110] = {0}, id_school[100001] = {0}; 6 | cin >> n; 7 | vector> v(n+1); 8 | for(int i = 1; i <= n; i++) 9 | cin >> num[i]; 10 | while(1) { 11 | bool flag = true; 12 | for(int i = 1; i < v.size(); i++) { 13 | if(v[i].size() < num[i] * 10) { 14 | if(id_school[cnt-1] != i) { 15 | id_school[cnt] = i; 16 | v[i].push_back(cnt); 17 | cnt++; 18 | } else { 19 | id_school[cnt+1] = i; 20 | v[i].push_back(cnt+1); 21 | cnt = cnt + 2; 22 | } 23 | flag = false; 24 | } 25 | } 26 | if(flag) break; 27 | } 28 | for(int i = 1; i < v.size(); i++) { 29 | cout << "#" << i << endl; 30 | for(int j = 0; j < v[i].size(); j++) { 31 | if(j != 0 && j % 10 != 0) cout << " "; 32 | if(j != 0 && j % 10 == 0) cout << endl; 33 | cout << v[i][j]; 34 | } 35 | cout << endl; 36 | } 37 | return 0; 38 | } -------------------------------------------------------------------------------- /L1-050 倒数第N个字符串.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int main() { 6 | int l, n, num; 7 | cin >> l >> n; 8 | vector v; 9 | num = pow(26,l) - n ; 10 | while(num) { 11 | v.push_back(num % 26); 12 | num /= 26; 13 | } 14 | for(int i = 0; i < l - v.size(); i++) 15 | cout << 'a'; 16 | for(int i = v.size() - 1; i >= 0; i--) 17 | cout << (char)('a' + v[i]); 18 | return 0; 19 | } -------------------------------------------------------------------------------- /L1-051 打折.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main() { 3 | int a, b; 4 | scanf("%d%d", &a, &b); 5 | printf("%.2f", a * b * 0.1); 6 | return 0; 7 | } -------------------------------------------------------------------------------- /L1-052 2018我们要赢.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main() { 3 | printf("2018\nwo3 men2 yao4 ying2 !"); 4 | return 0; 5 | } -------------------------------------------------------------------------------- /L1-053 电子汪.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main() { 3 | int a, b; 4 | scanf("%d%d", &a, &b); 5 | for(int i = 0; i < a + b; i++) 6 | printf("Wang!"); 7 | return 0; 8 | } -------------------------------------------------------------------------------- /L1-054 福到了.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() { 5 | char c; 6 | int n, flag = 0; 7 | scanf("%c%d",&c, &n); 8 | getchar(); 9 | vector a(n); 10 | for(int i = 0; i < n; i++) 11 | getline(cin,a[i]); 12 | for(int i = 0; i < n; i++) 13 | for(int j = 0; j < n; j++) 14 | if(a[i][j] != a[n-1-i][n-1-j]) 15 | flag = 1; 16 | if(flag == 0) cout << "bu yong dao le\n"; 17 | for(int i = 0; i < n; i++) { 18 | for(int j = 0; j < n; j++) { 19 | if(a[n-1-i][n-1-j] == '@') 20 | cout << c; 21 | else 22 | cout << " "; 23 | } 24 | cout << endl; 25 | } 26 | return 0; 27 | } 28 | 29 | -------------------------------------------------------------------------------- /L1-055 谁是赢家.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | int votea, voteb, adj1, adj2, adj3, suma; 5 | cin >> votea >> voteb >> adj1 >> adj2 >> adj3; 6 | suma= 3 - (adj1 + adj2 + adj3); 7 | if(suma == 3 || (suma >= 1 && votea > voteb)) 8 | printf("The winner is a: %d + %d", votea, suma); 9 | else 10 | printf("The winner is b: %d + %d", voteb, 3-suma); 11 | return 0; 12 | } 13 | -------------------------------------------------------------------------------- /L1-056 猜数字.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() { 5 | int n, t, sum = 0, mindet = 1000, minid; 6 | string name, a[110]; 7 | cin >> n; 8 | for(int i = 0; i < n; i++) { 9 | cin >> name >> t; 10 | a[t] = name; 11 | sum += t; 12 | } 13 | double avg = 0.5 * sum / n; 14 | for(int i = 0; i <= 100; i++) 15 | if(a[i] != "" && abs(avg - i) < mindet) { 16 | minid = i; 17 | mindet = abs(avg - i); 18 | } 19 | cout << (int)avg << " " << a[minid]; 20 | return 0; 21 | } 22 | -------------------------------------------------------------------------------- /L1-057 PTA使我精神焕发.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | cout << "PTA shi3 wo3 jing1 shen2 huan4 fa1 !"; 5 | return 0; 6 | } -------------------------------------------------------------------------------- /L1-058 6翻了.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | string s; 4 | int main() { 5 | getline(cin, s); 6 | for (int i = 0, cnt; i < (int)s.size(); i++) { 7 | if (s[i] != '6') cout << s[i]; 8 | else { 9 | cnt = 1; 10 | while (i + cnt < (int)s.size() && s[i+cnt] == '6') cnt++; 11 | if (cnt <= 3) { 12 | for (int j = 0; j < cnt; j++) cout << '6'; 13 | } else if (cnt <= 9) cout << '9'; 14 | else cout << "27"; 15 | i += cnt - 1; 16 | } 17 | } 18 | return 0; 19 | } -------------------------------------------------------------------------------- /L1-059 敲笨钟.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int cnt, flag; 4 | string s[101]; 5 | int main() { 6 | cin >> s[0]; 7 | while (cin >> s[cnt]) { 8 | if (s[cnt].back() == ',') { 9 | if ((int)s[cnt].size() >= 4 && *(s[cnt].end() - 2) == 'g' && *(s[cnt].end() - 3) == 'n' && *(s[cnt].end() - 4) == 'o') flag = 1; 10 | } else if (s[cnt].back() == '.') { 11 | if ((int)s[cnt].size() >= 4 && flag && *(s[cnt].end() - 2) == 'g' && *(s[cnt].end() - 3) == 'n' && *(s[cnt].end() - 4) == 'o') { 12 | for (int i = 0; i < cnt - 2; i++) cout << s[i] << ' '; 13 | cout << "qiao ben zhong.\n"; 14 | } else cout << "Skipped\n"; 15 | cnt = flag = 0; 16 | continue; 17 | } 18 | cnt++; 19 | } 20 | return 0; 21 | } -------------------------------------------------------------------------------- /L1-060 心理阴影面积.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int x, y; 4 | int main() { 5 | cin >> x >> y; 6 | cout << 5000 - 50 * y - (100 - x) * 50; 7 | return 0; 8 | } -------------------------------------------------------------------------------- /L1-061 新胖子公式.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | float kg, m, res; 3 | int main() { 4 | scanf("%f %f", &kg, &m); 5 | res = kg / (m * m); 6 | printf("%.1f\n", res); 7 | if(res > 25.0) printf("PANG"); 8 | else printf("Hai Xing"); 9 | return 0; 10 | } -------------------------------------------------------------------------------- /L1-062 幸运彩票.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | string s; 4 | int main() { 5 | cin >> s; 6 | while (cin >> s) { 7 | if (s[0] + s[1] + s[2] == s[3] + s[4] + s[5]) cout << "You are lucky!\n"; 8 | else cout << "Wish you good luck.\n"; 9 | } 10 | return 0; 11 | } -------------------------------------------------------------------------------- /L1-063 吃鱼还是吃肉.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int n, sex, s, t; 4 | int main() { 5 | cin >> n; 6 | while (n--) { 7 | cin >> sex >> s >> t; 8 | if (sex == 1) { 9 | if (s < 130) cout << "duo chi yu! "; 10 | else if (s == 130) cout << "wan mei! "; 11 | else cout << "ni li hai! "; 12 | if (t < 27) cout << "duo chi rou!\n"; 13 | else if (t == 27) cout << "wan mei!\n"; 14 | else cout << "shao chi rou!\n"; 15 | } else { 16 | if (s < 129) cout << "duo chi yu! "; 17 | else if (s == 129) cout << "wan mei! "; 18 | else cout << "ni li hai! "; 19 | if (t < 25) cout << "duo chi rou!\n"; 20 | else if (t == 25) cout << "wan mei!\n"; 21 | else cout << "shao chi rou!\n"; 22 | } 23 | } 24 | return 0; 25 | } -------------------------------------------------------------------------------- /L1-064 估值一亿的AI核心代码.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | string s; 4 | int main() { 5 | getline(cin, s); 6 | while (getline(cin, s)) { 7 | cout << s << '\n' << "AI: "; 8 | s = regex_replace(s, regex(R"(\s+)"), " "); 9 | s = regex_replace(s, regex(R"(^\s+|\s+$|\s+(?=\W))"), ""); 10 | s = regex_replace(s, regex(R"(\bI\b)"), "mark_mark"); 11 | for (int i = 0; i < (int)s.size(); i++) if (s[i] != 'I') s[i] = tolower(s[i]); 12 | s = regex_replace(s, regex(R"(\bcan you\b)"), "I can"); 13 | s = regex_replace(s, regex(R"(\bcould you\b)"), "I could"); 14 | s = regex_replace(s, regex(R"(mark_mark|\bme\b)"), "you"); 15 | s = regex_replace(s, regex(R"(\?)"), "!"); 16 | cout << s << '\n'; 17 | } 18 | return 0; 19 | } -------------------------------------------------------------------------------- /L1-065 嫑废话上代码.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | cout << "Talk is cheap. Show me the code."; 5 | return 0; 6 | } -------------------------------------------------------------------------------- /L1-066 猫是液体.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int a, b, c; 4 | int main() { 5 | cin >> a >> b >> c; 6 | cout << a * b * c; 7 | return 0; 8 | } -------------------------------------------------------------------------------- /L1-067 洛希极限.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | double a, b, c, ans; 4 | int main() { 5 | scanf("%lf %lf %lf", &a, &b, &c); 6 | ans = a * (b == 1.0 ? 1.26 : 2.455); 7 | printf("%.2lf %s", ans, c > ans ? "^_^" : "T_T"); 8 | return 0; 9 | } -------------------------------------------------------------------------------- /L1-068 调和平均.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | double n, temp, sum, ans; 3 | int main() { 4 | scanf("%lf", &n); 5 | for (int i = 0; i < n; i++) { 6 | scanf("%lf", &temp); 7 | sum += 1.0 / temp; 8 | } 9 | printf("%.2lf", n / sum); 10 | return 0; 11 | } -------------------------------------------------------------------------------- /L1-069 胎压监测.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int wheel[4], maxn, low, dif, flag; 4 | int main() { 5 | cin >> wheel[0] >> wheel[1] >> wheel[2] >> wheel[3] >> low >> dif; 6 | maxn = *max_element(wheel, wheel + 4); 7 | for (int i = 0; i < 4; i++) { 8 | if (wheel[i] < low || maxn - wheel[i] > dif) { 9 | if (!flag) flag = i + 1; 10 | else { 11 | cout << "Warning: please check all the tires!"; 12 | return 0; 13 | } 14 | } 15 | } 16 | if (flag) cout << "Warning: please check #" << flag << "!"; 17 | else cout << "Normal"; 18 | return 0; 19 | } -------------------------------------------------------------------------------- /L1-070 吃火锅.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int sum, cnt, first; 4 | string s; 5 | int main() { 6 | while (getline(cin, s)) { 7 | if (s == ".") break; 8 | sum++; 9 | if (s.find("chi1 huo3 guo1") != -1) { 10 | if (!first) first = sum; 11 | cnt++; 12 | } 13 | } 14 | cout << sum << '\n'; 15 | if (!cnt) cout << "-_-#"; 16 | else cout << first << ' ' << cnt; 17 | return 0; 18 | } -------------------------------------------------------------------------------- /L1-071 前世档案.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int n, m, temp, ans; 4 | string s; 5 | int main() { 6 | cin >> n >> m; 7 | while (m--) { 8 | temp = 1 << (n-1); 9 | ans = 1; 10 | cin >> s; 11 | for (auto &it : s) { 12 | if (it == 'n') ans += temp; 13 | temp >>= 1; 14 | } 15 | cout << ans << '\n'; 16 | } 17 | return 0; 18 | } -------------------------------------------------------------------------------- /L1-072 刮刮彩票.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int a[3][3], lost = 45, lx, ly, ans, x, y, dir; 4 | int gua[9][3] = {{0, 0, 0}, {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {1, 4, 7}, {2, 5, 8}, {3, 6, 9}, {1, 5, 9}, {3, 5, 7}}; 5 | int got[30] = {0, 0, 0, 0, 0, 0, 10000, 36, 720, 360, 80, 252, 108, 72, 54, 180, 72, 180, 119, 36, 306, 1080, 144, 1800, 3600}; 6 | int main() { 7 | for (int i = 0; i < 3; ++i) { 8 | for (int j = 0; j < 3; ++j) { 9 | cin >> a[i][j]; 10 | lost -= a[i][j]; 11 | if (a[i][j] == 0) lx = i, ly = j; 12 | } 13 | } 14 | a[lx][ly] = lost; 15 | for (int i = 0; i < 3; ++i) { 16 | cin >> x >> y; 17 | cout << a[x-1][y-1] << endl; 18 | } 19 | cin >> dir; 20 | for (int i = 0; i < 3; ++i) ans += *(a[0] + gua[dir][i] - 1); 21 | cout << got[ans]; 22 | return 0; 23 | } -------------------------------------------------------------------------------- /L1-073 人与神.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | cout << "To iterate is human, to recurse divine."; 5 | return 0; 6 | } -------------------------------------------------------------------------------- /L1-074 两个小时学完C语言.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | int n, k, m; 5 | cin >> n >> k >> m; 6 | cout << n - k * m; 7 | return 0; 8 | } -------------------------------------------------------------------------------- /L1-075 强迫症.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | string s; 4 | int main() { 5 | cin >> s; 6 | if (s.length() == 4) { 7 | int a = (s[0] - '0') * 10 + s[1] - '0'; 8 | printf("%d", a < 22 ? 20 : 19); 9 | cout << s[0] << s[1] << "-" << s[2] << s[3]; 10 | } else { 11 | cout << s[0] << s[1] << s[2] << s[3] << "-" << s[4] << s[5]; 12 | } 13 | return 0; 14 | } -------------------------------------------------------------------------------- /L1-076 降价提醒机器人.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int n, m; 4 | double temp; 5 | int main() { 6 | scanf("%d %d", &n, &m); 7 | for (int i = 0; i < n; ++i) { 8 | scanf("%lf", &temp); 9 | if (temp < (double)m) { 10 | cout << "On Sale! "; 11 | printf("%.1lf\n", temp); 12 | } 13 | } 14 | return 0; 15 | } -------------------------------------------------------------------------------- /L1-077 大笨钟的心情.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int t, a[30]; 4 | int main() { 5 | for (int i = 0; i < 24; i++) cin >> a[i]; 6 | while (cin >> t) { 7 | if (t < 0 || t > 23) break; 8 | printf("%d %s\n", a[t], a[t] <= 50 ? "No" : "Yes"); 9 | } 10 | return 0; 11 | } -------------------------------------------------------------------------------- /L1-078 吉老师的回归.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int n, m, cnt; 4 | string s, ans; 5 | int check(string a) { 6 | for (int i = 0; i < a.length(); i++) 7 | if (a.substr(i, 7) == "qiandao" || a.substr(i, 4) == "easy") return 1; 8 | return 0; 9 | } 10 | int main() { 11 | cin >> n >> m; 12 | getchar(); 13 | for (int i = 0; i < n; i++) { 14 | getline(cin, s); 15 | if (check(s)) continue; 16 | else { 17 | if (cnt == m) ans = s; 18 | cnt++; 19 | } 20 | } 21 | if (cnt <= m) cout << "Wo AK le"; 22 | else cout << ans; 23 | return 0; 24 | } -------------------------------------------------------------------------------- /L1-079 天梯赛的善良.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | map A; 4 | int n, minn = INT_MAX, maxn = INT_MIN; 5 | int main() { 6 | cin >> n; 7 | for (int i = 0; i < n; i++) { 8 | int t; 9 | cin >> t; 10 | A[t]++; 11 | if (minn > t) minn = t; 12 | if (maxn < t) maxn = t; 13 | } 14 | cout << minn << ' ' << A[minn] << '\n' << da << ' ' << A[maxn]; 15 | return 0; 16 | } -------------------------------------------------------------------------------- /L1-080 乘法口诀数列.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int a, b, n, last = 3, sum, A[2000]; 4 | int main() { 5 | cin >> a >> b >> n; 6 | A[1] = a, A[2] = b; 7 | for (int i = 1; i <= n; i++) { 8 | sum = A[i] * A[i + 1]; 9 | if (sum < 10) A[last++] = sum; 10 | else { 11 | A[last++] = sum / 10; 12 | A[last++] = sum % 10; 13 | } 14 | } 15 | for (int i = 1; i <= n; i++) { 16 | if (i != 1) cout << ' '; 17 | cout << A[i]; 18 | } 19 | return 0; 20 | } -------------------------------------------------------------------------------- /L1-081 今天我要赢.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | cout << "I'm gonna win! Today!\n2022-04-23"; 5 | return 0; 6 | } -------------------------------------------------------------------------------- /L1-082 种钻石.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int N, v; 4 | int main() { 5 | cin >> N >> v; 6 | cout << N / v; 7 | return 0; 8 | } -------------------------------------------------------------------------------- /L1-083 谁能进图书馆.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int prohibit, accompany, q1, q2; 4 | int main() { 5 | cin >> prohibit >> accompany >> q1 >> q2; 6 | cout << q1 << '-'; 7 | if (q1 >= prohibit && q2 >= prohibit) cout << "Y " << q2 << "-Y\nhuan ying ru guan"; 8 | else if (q1 < prohibit && q2 < prohibit) cout << "N " << q2 << "-N\nzhang da zai lai ba"; 9 | else if (q1 >= accompany) cout << "Y " << q2 << "-Y\nqing 1 zhao gu hao 2"; 10 | else if (q2 >= accompany) cout << "Y " << q2 << "-Y\nqing 2 zhao gu hao 1"; 11 | else if (q1 >= prohibit) cout << "Y " << q2 << "-N\n1: huan ying ru guan"; 12 | else cout << "N " << q2 << "-Y\n2: huan ying ru guan"; 13 | return 0; 14 | } -------------------------------------------------------------------------------- /L1-084 拯救外星人.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int A, B, C = 1; 4 | int main() { 5 | cin >> A >> B; 6 | for (int i = 1; i <= A + B; i++) { 7 | C *= i; 8 | } 9 | cout << C; 10 | return 0; 11 | } -------------------------------------------------------------------------------- /L1-085 试试手气.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int n, dice[6]; 4 | int main() { 5 | for (int i = 0; i < 6; i++) cin >> dice[i]; 6 | cin >> n; 7 | for (int i = 0; i < 6; i++) { 8 | if (i) cout << ' '; 9 | if (dice[i] >= 7 - n) cout << 6 - n; 10 | else cout << 7 - n; 11 | } 12 | return 0; 13 | } -------------------------------------------------------------------------------- /L1-086 斯德哥尔摩火车上的题.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | string s, a, S = "", A = ""; 4 | int main() { 5 | cin >> s >> a; 6 | for (int i = 1; i < s.size(); i++) { 7 | if (s[i] % 2 == s[i - 1] % 2) S += max(s[i], s[i - 1]); 8 | } 9 | for (int i = 1; i < a.size(); i++) { 10 | if (a[i] % 2 == a[i - 1] % 2) A += max(a[i], a[i - 1]); 11 | } 12 | cout << S; 13 | if (S != A) cout << '\n' << A; 14 | return 0; 15 | } -------------------------------------------------------------------------------- /L1-087 机工士姆斯塔迪奥.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int N, M, Q, T, C, Num_C, Num_R, Column[100001], Row[100001]; 4 | int main() { 5 | cin >> N >> M >> Q; 6 | for (int i = 0; i < Q; i++) { 7 | cin >> T >> C; 8 | if (T && !Column[C]) { 9 | Column[C] = 1; 10 | ++Num_C; 11 | } else if (!T && !Row[C]) { 12 | Row[C] = 1; 13 | ++Num_R; 14 | } 15 | } 16 | cout << N * M - Num_C * N - Num_R * M + Num_C * Num_R; 17 | return 0; 18 | } -------------------------------------------------------------------------------- /L1-088 静静的推荐.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int N, K, S, ans, score_gplt, score_pat, mark[10001]; 4 | int main() { 5 | cin >> N >> K >> S; 6 | for (int i = 0; i < N; i++) { 7 | cin >> score_gplt >> score_pat; 8 | if (score_gplt >= 175) { 9 | if (score_pat >= S) ++ans; 10 | else if (mark[score_gplt] < K) { 11 | ans++; 12 | mark[score_gplt]++; 13 | } 14 | } 15 | } 16 | cout << ans; 17 | return 0; 18 | } -------------------------------------------------------------------------------- /L1-089 最好的文档.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | cout << "Good code is its own best documentation."; 5 | return 0; 6 | } -------------------------------------------------------------------------------- /L1-090 什么是机器学习.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | int a, b; 5 | cin >> a >> b; 6 | cout << a + b - 16 << '\n' << a + b - 3 << '\n' << a + b - 1 << '\n' << a + b; 7 | return 0; 8 | } -------------------------------------------------------------------------------- /L1-091 程序员买包子.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | int N, M, K; 5 | string X; 6 | cin >> N >> X >> M >> K; 7 | if (K == N) cout << "mei you mai " << X << " de"; 8 | else if (K == M) cout << "kan dao le mai " << X << " de"; 9 | else cout << "wang le zhao mai " << X << " de"; 10 | return 0; 11 | } -------------------------------------------------------------------------------- /L1-092 进化论.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | int N, A, B, C; 5 | cin >> N; 6 | while(N--) { 7 | cin >> A >> B >> C; 8 | if (C == A * B) cout << "Lv Yan\n"; 9 | else if (C == A + B) cout << "Tu Dou\n"; 10 | else cout << "zhe du shi sha ya!\n"; 11 | } 12 | return 0; 13 | } -------------------------------------------------------------------------------- /L1-093 猜帽子游戏.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int Hat[105], Guess, Right, Wrong, N, K; 4 | int main() { 5 | cin >> N; 6 | for (int i = 1; i <= N; i++) cin >> Hat[i]; 7 | cin >> K; 8 | while(K--) { 9 | Right = Wrong = 0; 10 | for (int i = 1; i <= N; i++) { 11 | cin >> Guess; 12 | if (Guess && Guess == Hat[i]) Right = 1; 13 | else if (Guess && Guess != Hat[i]) Wrong = 1; 14 | } 15 | if (Wrong || !Right) cout << "Ai Ya\n"; 16 | else cout << "Da Jiang!!!\n"; 17 | } 18 | return 0; 19 | } -------------------------------------------------------------------------------- /L1-094 剪切粘贴.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | string s, a, b, X; 5 | int N, l, r, pos; 6 | int main() { 7 | cin >> s >> N; 8 | while (N--) { 9 | cin >> l >> r >> a >> b; 10 | X = s.substr(l - 1, r - l + 1); 11 | s.erase(l - 1, r - l + 1); 12 | pos = s.find(a + b); 13 | if (pos == -1) s = s + X; 14 | else { 15 | s = s.substr(0, pos + (int)a.size()) + X + s.substr(pos + (int)a.size()); 16 | } 17 | } 18 | cout << s; 19 | return 0; 20 | } -------------------------------------------------------------------------------- /L1-095 分寝室.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int n0, n1, n, F, M; 4 | int main() { 5 | cin >> n0 >> n1 >> n; 6 | for (int i = 2; i <= n0; i++) { 7 | if (n0 % i != 0 || n0 / i > n) continue; 8 | int j = n - n0 / i; 9 | if (n1 % j != 0) continue; 10 | if (!F || abs(i - n1 / j) < abs(n0 / F - n1 / M)) { 11 | F = n0 / i, M = j; 12 | } 13 | } 14 | if (F) cout << F << ' ' << M; 15 | else cout << "No Solution"; 16 | return 0; 17 | } -------------------------------------------------------------------------------- /L1-096 谁管谁叫爹.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int N, a, b; 6 | string A, B; 7 | int main() { 8 | cin >> N; 9 | while(N--) { 10 | cin >> A >> B; 11 | a = b = 0; 12 | for (auto it : A) { 13 | a += it - '0'; 14 | } 15 | for (auto it : B) { 16 | b += it - '0'; 17 | } 18 | if (stoi(A) % b == 0 && stoi(B) % a != 0) cout << "A\n"; 19 | else if (stoi(A) % b != 0 && stoi(B) % a == 0) cout << "B\n"; 20 | else if (stoi(A) > stoi(B)) cout << "A\n"; 21 | else cout << "B\n"; 22 | } 23 | return 0; 24 | } -------------------------------------------------------------------------------- /L2-001 紧急救援 .cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int n, m, c1, c2; 5 | int dis[510], weight[510], e[510][510], num[510], w[510], pre[510]; 6 | bool visit[510]; 7 | const int inf = 99999999; 8 | void printPath(int v) { 9 | if(v == c1) { 10 | printf("%d", v); 11 | return ; 12 | } 13 | printPath(pre[v]); 14 | printf(" %d", v); 15 | } 16 | int main() { 17 | scanf("%d%d%d%d", &n, &m, &c1, &c2); 18 | for(int i = 0; i < n; i++) 19 | scanf("%d", &weight[i]); 20 | fill(e[0], e[0] + 510 * 510, inf); 21 | fill(dis, dis + 510, inf); 22 | int a, b, c; 23 | for(int i = 0; i < m; i++) { 24 | scanf("%d%d%d", &a, &b, &c); 25 | e[a][b] = c; 26 | e[b][a] = c; 27 | } 28 | dis[c1] = 0; 29 | w[c1] = weight[c1]; 30 | num[c1] = 1; 31 | for(int i = 0; i < n; i++) { 32 | int u = -1, minn = inf; 33 | for(int j = 0; j < n; j++) { 34 | if(visit[j] == false && dis[j] < minn) { 35 | u = j; 36 | minn = dis[j]; 37 | } 38 | } 39 | if(u == -1) break; 40 | visit[u] = true; 41 | for(int v = 0; v < n; v++) { 42 | if(visit[v] == false && e[u][v] != inf) { 43 | if(dis[u] + e[u][v] < dis[v]) { 44 | dis[v] = dis[u] + e[u][v]; 45 | num[v] = num[u]; 46 | w[v] = w[u] + weight[v]; 47 | pre[v] = u; 48 | } else if(dis[u] + e[u][v] == dis[v]) { 49 | num[v] = num[v] + num[u]; 50 | if(w[u] + weight[v] > w[v]) { 51 | w[v] = w[u] + weight[v]; 52 | pre[v] = u; 53 | } 54 | } 55 | } 56 | } 57 | } 58 | printf("%d %d\n", num[c2], w[c2]); 59 | printPath(c2); 60 | return 0; 61 | } -------------------------------------------------------------------------------- /L2-002 链表去重.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | const int maxn = 100000; 6 | struct NODE { 7 | int address, key, next, num; 8 | }node[maxn]; 9 | bool exist[maxn]; 10 | int cmp1(NODE a, NODE b){ 11 | return a.num < b.num; 12 | } 13 | int main() { 14 | int begin, n, cnt1 = 0, cnt2 = 0, a; 15 | scanf("%d%d", &begin, &n); 16 | for(int i = 0; i < maxn; i++) { 17 | node[i].num = 2 * maxn; 18 | } 19 | for(int i = 0; i < n; i++) { 20 | scanf("%d", &a); 21 | scanf("%d%d", &node[a].key, &node[a].next); 22 | node[a].address = a; 23 | } 24 | for(int i = begin; i != -1; i = node[i].next) { 25 | if(exist[abs(node[i].key)] == false) { 26 | exist[abs(node[i].key)] = true; 27 | node[i].num = cnt1; 28 | cnt1++; 29 | } 30 | else { 31 | node[i].num = maxn + cnt2; 32 | cnt2++; 33 | } 34 | } 35 | sort(node, node + maxn, cmp1); 36 | int cnt = cnt1 + cnt2; 37 | for(int i = 0; i < cnt; i++) { 38 | if(i != cnt1 - 1 && i != cnt - 1) { 39 | printf("%05d %d %05d\n", node[i].address, node[i].key, node[i+1].address); 40 | } else { 41 | printf("%05d %d -1\n", node[i].address, node[i].key); 42 | } 43 | } 44 | return 0; 45 | } 46 | -------------------------------------------------------------------------------- /L2-003 月饼 .cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | struct mooncake{ 6 | float num, price, unit; 7 | }; 8 | int cmp(mooncake a, mooncake b) { 9 | return a.unit > b.unit; 10 | } 11 | int main() { 12 | int n, need; 13 | cin >> n >> need; 14 | vector a(n); 15 | for (int i = 0; i < n; i++) scanf("%f", &a[i].num); 16 | for (int i = 0; i < n; i++) scanf("%f", &a[i].price); 17 | for (int i = 0; i < n; i++) a[i].unit = a[i].price / a[i].num; 18 | sort(a.begin(), a.end(), cmp); 19 | float result = 0.0; 20 | for (int i = 0; i < n; i++) { 21 | if (a[i].num <= need) { 22 | result = result + a[i].price; 23 | } else { 24 | result = result + a[i].unit * need; 25 | break; 26 | } 27 | need = need - a[i].num; 28 | } 29 | printf("%.2f",result); 30 | return 0; 31 | } -------------------------------------------------------------------------------- /L2-004 这是二叉搜索树吗?.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | bool isMirror; 5 | vector pre, post; 6 | void getpost(int root, int tail) { 7 | if(root > tail) return ; 8 | int i = root + 1, j = tail; 9 | if(!isMirror) { 10 | while(i <= tail && pre[root] > pre[i]) i++; 11 | while(j > root && pre[root] <= pre[j]) j--; 12 | } else { 13 | while(i <= tail && pre[root] <= pre[i]) i++; 14 | while(j > root && pre[root] > pre[j]) j--; 15 | } 16 | if(i - j != 1) return ; 17 | getpost(root + 1, j); 18 | getpost(i, tail); 19 | post.push_back(pre[root]); 20 | } 21 | int main() { 22 | int n; 23 | scanf("%d", &n); 24 | pre.resize(n); 25 | for(int i = 0; i < n; i++) 26 | scanf("%d", &pre[i]); 27 | getpost(0, n - 1); 28 | if(post.size() != n) { 29 | isMirror = true; 30 | post.clear(); 31 | getpost(0, n - 1); 32 | } 33 | if(post.size() == n) { 34 | printf("YES\n%d", post[0]); 35 | for(int i = 1; i < n; i++) 36 | printf(" %d", post[i]); 37 | } else { 38 | printf("NO"); 39 | } 40 | return 0; 41 | } -------------------------------------------------------------------------------- /L2-005 集合相似度.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int main() { 6 | int n, m, k, temp, a, b; 7 | scanf("%d", &n); 8 | vector> v(n); 9 | for(int i = 0; i < n; i++) { 10 | scanf("%d", &m); 11 | set s; 12 | for(int j = 0; j < m; j++) { 13 | scanf("%d", &temp); 14 | s.insert(temp); 15 | } 16 | v[i] = s; 17 | } 18 | scanf("%d", &k); 19 | for(int i = 0; i < k; i++) { 20 | scanf("%d %d", &a, &b); 21 | int nc = 0, nt = v[b-1].size(); 22 | for(auto it = v[a-1].begin(); it != v[a-1].end(); it++) { 23 | if(v[b-1].find(*it) == v[b-1].end()) 24 | nt++; 25 | else 26 | nc++; 27 | } 28 | double ans = (double)nc / nt * 100; 29 | printf("%.2f%%\n", ans); 30 | } 31 | return 0; 32 | } -------------------------------------------------------------------------------- /L2-006 树的遍历.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | vector post, in; 6 | map level; 7 | void pre(int root, int start, int end, int index) { 8 | if(start > end) return ; 9 | int i = start; 10 | while(i < end && in[i] != post[root]) i++; 11 | level[index] = post[root]; 12 | pre(root - 1 - end + i, start, i - 1, 2 * index + 1); 13 | pre(root - 1, i + 1, end, 2 * index + 2); 14 | } 15 | int main() { 16 | int n; 17 | scanf("%d", &n); 18 | post.resize(n); 19 | in.resize(n); 20 | for(int i = 0; i < n; i++) scanf("%d", &post[i]); 21 | for(int i = 0; i < n; i++) scanf("%d", &in[i]); 22 | pre(n-1, 0, n-1, 0); 23 | auto it = level.begin(); 24 | printf("%d", it->second); 25 | while(++it != level.end()) printf(" %d", it->second); 26 | return 0; 27 | } -------------------------------------------------------------------------------- /L2-007 家庭房产.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | struct DATA { 5 | int id, fid, mid, num, area; 6 | int cid[10]; 7 | }data[1005]; 8 | struct node { 9 | int id, people; 10 | double num, area; 11 | bool flag = false; 12 | }ans[10000]; 13 | int father[10000]; 14 | bool visit[10000]; 15 | int find(int x) { 16 | while(x != father[x]) 17 | x = father[x]; 18 | return x; 19 | } 20 | void Union(int a, int b) { 21 | int faA = find(a); 22 | int faB = find(b); 23 | if(faA > faB) 24 | father[faA] = faB; 25 | else if(faA < faB) 26 | father[faB] = faA; 27 | } 28 | int cmp1(node a, node b) { 29 | if(a.area != b.area) 30 | return a.area > b.area; 31 | else 32 | return a.id < b.id; 33 | } 34 | int main() { 35 | int n, k, cnt = 0; 36 | scanf("%d", &n); 37 | for(int i = 0; i < 10000; i++) 38 | father[i] = i; 39 | for(int i = 0; i < n; i++) { 40 | scanf("%d %d %d %d", &data[i].id, &data[i].fid, &data[i].mid, &k); 41 | visit[data[i].id] = true; 42 | if(data[i].fid != -1) { 43 | visit[data[i].fid] = true; 44 | Union(data[i].fid, data[i].id); 45 | } 46 | if(data[i].mid != -1) { 47 | visit[data[i].mid] = true; 48 | Union(data[i].mid, data[i].id); 49 | } 50 | for(int j = 0; j < k; j++) { 51 | scanf("%d", &data[i].cid[j]); 52 | visit[data[i].cid[j]] = true; 53 | Union(data[i].cid[j], data[i].id); 54 | } 55 | scanf("%d %d", &data[i].num, &data[i].area); 56 | } 57 | for(int i = 0; i < n; i++) { 58 | int id = find(data[i].id); 59 | ans[id].id = id; 60 | ans[id].num += data[i].num; 61 | ans[id].area += data[i].area; 62 | ans[id].flag = true; 63 | } 64 | for(int i = 0; i < 10000; i++) { 65 | if(visit[i]) 66 | ans[find(i)].people++; 67 | if(ans[i].flag) 68 | cnt++; 69 | } 70 | for(int i = 0; i < 10000; i++) { 71 | if(ans[i].flag) { 72 | ans[i].num = (double)(ans[i].num * 1.0 / ans[i].people); 73 | ans[i].area = (double)(ans[i].area * 1.0 / ans[i].people); 74 | } 75 | } 76 | sort(ans, ans + 10000, cmp1); 77 | printf("%d\n", cnt); 78 | for(int i = 0; i < cnt; i++) 79 | printf("%04d %d %.3f %.3f\n", ans[i].id, ans[i].people, ans[i].num, ans[i].area); 80 | return 0; 81 | } 82 | -------------------------------------------------------------------------------- /L2-008 最长对称子串.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() { 4 | string s; 5 | getline(cin, s); 6 | int maxvalue = 0, temp; 7 | int len = s.length(); 8 | for(int i = 0; i < len; i++) { 9 | temp = 1; 10 | for(int j = 1; j < len; j++) { 11 | if(i - j < 0 || i + j >= len || s[i - j] != s[i + j]) 12 | break; 13 | temp += 2; 14 | } 15 | maxvalue = temp > maxvalue ? temp : maxvalue; 16 | temp = 0; 17 | for(int j = 1; j < len; j++) { 18 | if(i - j + 1 < 0 || i + j >= len || s[i - j + 1] != s[i + j]) 19 | break; 20 | temp += 2; 21 | } 22 | maxvalue = temp > maxvalue ? temp : maxvalue; 23 | } 24 | cout << maxvalue; 25 | return 0; 26 | } -------------------------------------------------------------------------------- /L2-009 抢红包.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | struct node { 6 | int id, total, getnum; 7 | }; 8 | bool cmp1(node a, node b) { 9 | if(a.total != b.total) 10 | return a.total > b.total; 11 | else if(a.getnum != b.getnum) 12 | return a.getnum > b.getnum; 13 | else 14 | return a.id < b.id; 15 | } 16 | int main() { 17 | int n, k, a, b; 18 | scanf("%d", &n); 19 | vector v(n + 1); 20 | for(int i = 1; i <= n; i++) { 21 | v[i].id = i; 22 | scanf("%d", &k); 23 | for(int j = 0; j < k; j++) { 24 | scanf("%d %d", &a, &b); 25 | v[a].total += b; 26 | v[a].getnum++; 27 | v[i].total -= b; 28 | } 29 | } 30 | sort(v.begin()+1, v.end(), cmp1); 31 | for(int i = 1; i <= n; i++) { 32 | double temp = (double)(v[i].total * 1.0 / 100); 33 | printf("%d %.2f\n", v[i].id, temp); 34 | } 35 | return 0; 36 | } 37 | -------------------------------------------------------------------------------- /L2-010 排座位.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | vector fri; 5 | int enemy[101][101]; 6 | int findfri(int x) { 7 | while(x != fri[x]) 8 | x = fri[x]; 9 | return x; 10 | } 11 | void Union(int a, int b) { 12 | int fria = findfri(a); 13 | int frib = findfri(b); 14 | if(fria != frib) 15 | fri[fria] = frib; 16 | } 17 | int main() { 18 | int n, m, k, a, b, c; 19 | scanf("%d %d %d", &n, &m, &k); 20 | fri.resize(n + 1); 21 | for(int i = 1; i <= n; i++) 22 | fri[i] = i; 23 | for(int i = 0; i < m; i++) { 24 | scanf("%d %d %d", &a, &b, &c); 25 | if(c == 1) 26 | Union(a, b); 27 | else { 28 | enemy[a][b] = 1; 29 | enemy[b][a] = 1; 30 | } 31 | } 32 | for(int i = 0; i < k; i++) { 33 | scanf("%d %d", &a, &b); 34 | if(findfri(a) == findfri(b) && enemy[a][b] == 0) 35 | printf("No problem\n"); 36 | else if(findfri(a) != findfri(b) && enemy[a][b] == 0) 37 | printf("OK\n"); 38 | else if(findfri(a) == findfri(b) && enemy[a][b] == 1) 39 | printf("OK but...\n"); 40 | else if(enemy[a][b] == 1) 41 | printf("No way\n"); 42 | } 43 | return 0; 44 | } -------------------------------------------------------------------------------- /L2-011 玩转二叉树.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | vector in, pre, level(100000, -1); 5 | void post(int root, int start, int end, int index) { 6 | if(start > end) return ; 7 | int i = start; 8 | while(i < end && in[i] != pre[root]) i++; 9 | level[index] = pre[root]; 10 | post(root + 1, start, i - 1, 2 * index + 2); 11 | post(root + 1 + i - start, i + 1, end, 2 * index + 1); 12 | } 13 | int main() { 14 | int n, cnt = 0; 15 | scanf("%d", &n); 16 | in.resize(n); 17 | pre.resize(n); 18 | for(int i = 0; i < n; i++) scanf("%d", &in[i]); 19 | for(int i = 0; i < n; i++) scanf("%d", &pre[i]); 20 | post(0, 0, n-1, 0); 21 | for(int i = 0; i < level.size(); i++) { 22 | if(level[i] != -1 && cnt != n - 1) { 23 | printf("%d ", level[i]); 24 | cnt++; 25 | } else if(level[i] != -1){ 26 | printf("%d", level[i]); 27 | break; 28 | } 29 | } 30 | return 0; 31 | } -------------------------------------------------------------------------------- /L2-012 关于堆的判断 .cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | vector v; 6 | int n; 7 | void upAdjust(int i) { 8 | if(i == 1) return ; 9 | while(i != 1) { 10 | if(v[i] < v[i / 2]) { 11 | swap(v[i], v[i / 2]); 12 | i = i / 2; 13 | } else { 14 | break; 15 | } 16 | } 17 | } 18 | void judge1(int a) { 19 | if(v[1] == a) printf("T\n"); 20 | else printf("F\n"); 21 | } 22 | void judge2(int a, int b) { 23 | int indexa = 0, indexb = 0; 24 | for(int i = 1; i <= n; i++) { 25 | if(v[i] == a) indexa = i; 26 | if(v[i] == b) indexb = i; 27 | } 28 | if(indexa > indexb) swap(indexa, indexb); 29 | if(indexa % 2 == 0 && indexb - indexa == 1) printf("T\n"); 30 | else printf("F\n"); 31 | } 32 | void judge3(int a, int b) { 33 | int indexa = 0, indexb = 0; 34 | for(int i = 1; i <= n; i++) { 35 | if(v[i] == a) indexa = i; 36 | if(v[i] == b) indexb = i; 37 | } 38 | if((2 * indexa) == indexb || (2 * indexa) + 1 == indexb) printf("T\n"); 39 | else printf("F\n"); 40 | } 41 | void judge4(int a, int b) { 42 | int indexa = 0, indexb = 0; 43 | for(int i = 1; i <= n; i++) { 44 | if(v[i] == a) indexa = i; 45 | if(v[i] == b) indexb = i; 46 | } 47 | if(indexa == indexb * 2 || indexa == 2 * indexb + 1) printf("T\n"); 48 | else printf("F\n"); 49 | } 50 | int main() { 51 | int k, a, b; 52 | char c[100]; 53 | scanf("%d%d", &n, &k); 54 | v.resize(n + 1); 55 | for(int i = 1; i <= n; i++) { 56 | scanf("%d", &v[i]); 57 | upAdjust(i); 58 | } 59 | for(int i = 0; i < k; i++) { 60 | scanf("%d%s", &a, c); 61 | if(strcmp(c, "and") == 0) { 62 | scanf("%d%s%s", &b, c, c); 63 | judge2(a, b); 64 | } else { 65 | scanf("%s", c); 66 | if(strcmp(c, "a") == 0) { 67 | scanf("%s%s%d", c, c, &b); 68 | judge4(a, b); 69 | } else { 70 | scanf("%s", c); 71 | if(strcmp(c, "root") == 0) { 72 | judge1(a); 73 | } else { 74 | scanf("%s%d", c, &b); 75 | judge3(a, b); 76 | } 77 | } 78 | } 79 | } 80 | return 0; 81 | } -------------------------------------------------------------------------------- /L2-013 红色警报.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | bool visit[510]; 5 | int e[510][510], n, m, k; 6 | void dfs(int node) { 7 | visit[node] = true; 8 | for(int i = 0; i < n; i++) { 9 | if(visit[i] == false && e[node][i] == 1) 10 | dfs(i); 11 | } 12 | } 13 | int countcnt() { 14 | int cnt = 0; 15 | fill(visit, visit + 510, false); 16 | for(int i = 0; i < n; i++) { 17 | if(visit[i] == false) { 18 | dfs(i); 19 | cnt++; 20 | } 21 | } 22 | return cnt; 23 | } 24 | int main() { 25 | scanf("%d%d", &n, &m); 26 | int a, b, city; 27 | for(int i = 0; i < m; i++) { 28 | scanf("%d%d", &a, &b); 29 | e[a][b] = e[b][a] = 1; 30 | } 31 | int cnt = countcnt(); 32 | scanf("%d", &k); 33 | for(int i = 0; i < k; i++) { 34 | scanf("%d", &city); 35 | for(int j = 0; j < n; j++) { 36 | if(e[city][j] == 1) { 37 | e[city][j] = 0; 38 | e[j][city] = 0; 39 | } 40 | } 41 | int tempcnt = countcnt(); 42 | if(tempcnt > cnt + 1) 43 | printf("Red Alert: City %d is lost!\n", city); 44 | else 45 | printf("City %d is lost.\n", city); 46 | cnt = tempcnt; 47 | if(i == n - 1) printf("Game Over.\n"); 48 | } 49 | return 0; 50 | } -------------------------------------------------------------------------------- /L2-014 列车调度.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() { 5 | int n, t; 6 | cin >> n; 7 | set s; 8 | s.insert(0); 9 | for(int i = 0; i < n; i++) { 10 | cin >> t; 11 | if(t < *s.rbegin()) { 12 | s.erase(*(s.upper_bound(t))); 13 | } 14 | s.insert(t); 15 | } 16 | cout << s.size() - 1; 17 | return 0; 18 | } -------------------------------------------------------------------------------- /L2-015 互评成绩.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int cmp1(double a, double b) {return a > b;} 6 | int main() { 7 | int n, k, m; 8 | scanf("%d %d %d", &n, &k, &m); 9 | vector total; 10 | for(int i = 0; i < n; i++) { 11 | vector v(k); 12 | double maxn = -1, minn = 101, average = 0.0; 13 | for(int j = 0; j < k; j++) { 14 | scanf("%lf", v[j]); 15 | maxn = max(maxn, v[j]); 16 | minn = min(minn, v[j]); 17 | average += v[j]; 18 | } 19 | average = average / (k - 2); 20 | total.push_back(average); 21 | } 22 | sort(total.begin(), total.end(), cmp1); 23 | if(m != 0) 24 | printf("%.3f", total[m - 1]); 25 | for(int i = m - 2; i >= 0; i--) 26 | printf(" %.3f", total[i]); 27 | return 0; 28 | } -------------------------------------------------------------------------------- /L2-016 愿天下有情人都是失散多年的兄妹 .cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | using namespace std; 6 | struct node { 7 | int f, m, sex; 8 | }; 9 | node v[100010]; 10 | int level[100010]; 11 | bool exist[100010]; 12 | int main() { 13 | int n, m, id, father, mother, a, b; 14 | scanf("%d", &n); 15 | char c; 16 | for(int i = 0; i < n; i++) { 17 | scanf("%d %c %d %d", &id, &c, &father, &mother); 18 | v[id].f = father, v[id].m = mother; 19 | if(c == 'M') v[id].sex = 0; 20 | else v[id].sex = 1; 21 | exist[id] = true; 22 | v[father].sex = 0; 23 | v[mother].sex = 1; 24 | } 25 | scanf("%d", &m); 26 | for(int i = 0; i < m; i++) { 27 | fill(level, level + 100010, 0); 28 | scanf("%d%d", &a, &b); 29 | if(v[a].sex == v[b].sex) { 30 | printf("Never Mind\n"); 31 | continue; 32 | } 33 | queue q; 34 | q.push(a); 35 | q.push(b); 36 | level[a] = 1; 37 | level[b] = 1; 38 | set s; 39 | int flag = 0; 40 | while(!q.empty()) { 41 | int top = q.front(); 42 | q.pop(); 43 | int size = s.size(); 44 | s.insert(top); 45 | if(size == s.size()) { 46 | printf("No\n"); 47 | flag = 1; 48 | break; 49 | } 50 | if(exist[top] == false) continue; 51 | if(level[top] <= 4) { 52 | int fa = v[top].f; 53 | int mo = v[top].m; 54 | if(fa != -1) { 55 | q.push(fa); 56 | level[fa] = level[top] + 1; 57 | } 58 | if(mo != -1) { 59 | q.push(mo); 60 | level[mo] = level[top] + 1; 61 | } 62 | } 63 | } 64 | if(flag == 0) printf("Yes\n"); 65 | } 66 | return 0; 67 | } -------------------------------------------------------------------------------- /L2-017 人以群分.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int main() { 6 | int n, sum = 0, half = 0; 7 | scanf("%d", &n); 8 | vector v(n); 9 | for (int i = 0; i < n; i++) { 10 | scanf("%d", &v[i]); 11 | sum += v[i]; 12 | } 13 | sort(v.begin(), v.end()); 14 | for(int i = 0; i < n / 2; i++) 15 | half += v[i]; 16 | printf("Outgoing #: %d\nIntroverted #: %d\nDiff = %d", (n + 1) / 2, n / 2, sum - 2 * half); 17 | return 0; 18 | } -------------------------------------------------------------------------------- /L2-018 多项式A除以B.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int nonNegativeNum(double c[], int start) { 5 | int cnt = 0; 6 | for (int i = start; i >= 0; i--) 7 | if (abs(c[i]) + 0.05 >= 0.1) cnt++; 8 | return cnt; 9 | } 10 | void printPoly(double c[], int start) { 11 | printf("%d", nonNegativeNum(c, start)); 12 | if (nonNegativeNum(c, start) == 0) printf(" 0 0.0"); 13 | for (int i = start; i >= 0; i--) 14 | if (abs(c[i]) + 0.05 >= 0.1) 15 | printf(" %d %.1f", i, c[i]); 16 | } 17 | double c1[3000], c2[3000], c3[3000]; 18 | int main() { 19 | int m = 0, n = 0, t = 0, max1 = -1, max2= -1; 20 | scanf("%d", &m); 21 | for (int i = 0; i < m; i++) { 22 | scanf("%d", &t); 23 | max1 = max1 > t ? max1 : t; 24 | scanf("%lf", &c1[t]); 25 | } 26 | scanf("%d", &n); 27 | for (int i = 0; i < n; i++) { 28 | scanf("%d", &t); 29 | max2 = max2 > t ? max2 : t; 30 | scanf("%lf", &c2[t]); 31 | } 32 | int t1 = max1, t2 = max2; 33 | while (t1 >= t2) { 34 | double c = c1[t1] / c2[t2]; 35 | c3[t1 - t2] = c; 36 | for (int i = t1, j = t2; j >= 0; j--, i--) c1[i] -= c2[j] * c; 37 | while (abs(c1[t1]) < 0.000001) t1--; 38 | } 39 | printPoly(c3, max1 - max2); 40 | printf("\n"); 41 | printPoly(c1, t1); 42 | return 0; 43 | } -------------------------------------------------------------------------------- /L2-019 悄悄关注.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int main() { 6 | int N, M, sum = 0, cnt, flag = 0; 7 | string str; 8 | cin >> N; 9 | set s; 10 | for (int i = 0; i < N; i++) { 11 | cin >> str; 12 | s.insert(str); 13 | } 14 | cin >> M; 15 | map m; 16 | for (int i = 0; i < M; i++) { 17 | cin >> str >> cnt; 18 | m[str] = cnt; 19 | sum += cnt; 20 | } 21 | sum /= M; 22 | for (auto it : m) { 23 | if (it.second > sum && s.find(it.first) == s.end()) { 24 | cout << it.first << endl; 25 | flag = 1; 26 | } 27 | } 28 | if (flag == 0) cout << "Bing Mei You"; 29 | return 0; 30 | } -------------------------------------------------------------------------------- /L2-020 功夫传人.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | vector > v; 5 | int n, k; 6 | double z, r, result = 0.0; 7 | bool visit[100010]; 8 | void dfs(int index, double power) { 9 | if (visit[index] == true) { 10 | result += power * v[index][0]; 11 | return; 12 | } 13 | for (int i = 0; i < v[index].size(); i++) 14 | dfs(v[index][i], power * (1 - r/100)); 15 | } 16 | int main() { 17 | scanf("%d%lf%lf", &n, &z, &r); 18 | v.resize(n); 19 | for (int i = 0; i < n; i++) { 20 | scanf("%d", &k); 21 | int temp; 22 | if (k == 0) { 23 | scanf("%d", &temp); 24 | v[i].push_back(temp); 25 | visit[i] = true; 26 | } 27 | for (int j = 0; j < k; j++) { 28 | scanf("%d", &temp); 29 | v[i].push_back(temp); 30 | } 31 | } 32 | dfs(0, z); 33 | printf("%d", (int)result); 34 | return 0; 35 | } -------------------------------------------------------------------------------- /L2-021 点赞狂魔.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | using namespace std; 6 | struct stu{ 7 | string name; 8 | int sum, cnt; 9 | }; 10 | bool cmp(stu a, stu b){ 11 | if(a.cnt != b.cnt) return a.cnt > b.cnt; 12 | return 1.0 * a.sum / a.cnt < 1.0 * b.sum / b.cnt; 13 | } 14 | bool a[10000010]; 15 | int main() { 16 | int n; 17 | cin >> n; 18 | vector ans(n); 19 | for(int i = 0; i < n; i++) { 20 | memset(a, false, sizeof(a)); 21 | int m, t, cnt = 0; 22 | string name; 23 | cin >> name >> m; 24 | for(int j = 0; j < m; j++) { 25 | cin >> t; 26 | if(a[t] == false) { 27 | a[t] = true; 28 | cnt++; 29 | } 30 | } 31 | ans[i] = {name, m, cnt}; 32 | } 33 | int nn = min(n, 3); 34 | partial_sort(ans.begin(),ans.begin() + nn, ans.end(), cmp); 35 | for(int i = 0; i < nn; i++) { 36 | if(i != 0) cout << " "; 37 | cout << ans[i].name; 38 | } 39 | for(int i = 0; i < 3 - n; i++) 40 | cout << " " << "-"; 41 | return 0; 42 | } 43 | -------------------------------------------------------------------------------- /L2-022 重排链表.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | struct node{ 5 | int id, data, next; 6 | }; 7 | int main() { 8 | int begin, n; 9 | cin >> begin >> n; 10 | node a[100010]; 11 | vector v, ans; 12 | for(int i = 0; i < n; i++) { 13 | int tbegin, tdata, tnext; 14 | cin >> tbegin >> tdata >> tnext; 15 | a[tbegin] = {tbegin, tdata, tnext}; 16 | } 17 | while(begin != -1) { 18 | v.push_back(a[begin]); 19 | begin = a[begin].next; 20 | } 21 | int l = 0, r = v.size() - 1; 22 | while(1) { 23 | ans.push_back(v[r]); 24 | r--; 25 | if((r + 1) - (l - 1) == 1) break; 26 | ans.push_back(v[l]); 27 | l++; 28 | if((r + 1) - (l - 1) == 1) break; 29 | } 30 | for(int i = 0; i < ans.size(); i++) { 31 | if(i != ans.size() - 1) 32 | printf("%05d %d %05d\n", ans[i].id, ans[i].data, ans[i+1].id); 33 | else 34 | printf("%05d %d -1\n", ans[i].id, ans[i].data); 35 | } 36 | return 0; 37 | } 38 | 39 | -------------------------------------------------------------------------------- /L2-023 图着色问题.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int n, m, k, num; 6 | vector> v(510); 7 | vector color(510); 8 | bool f(int i) { 9 | for(int j = 0; j < v[i].size(); j++) 10 | if(color[i] == color[v[i][j]]) 11 | return false; 12 | return true; 13 | } 14 | int main() { 15 | cin >> n >> m >> k; 16 | for(int i = 0; i < m; i++) { 17 | int t1, t2; 18 | cin >> t1 >> t2; 19 | v[t1].push_back(t2); 20 | v[t2].push_back(t1); 21 | } 22 | cin >> num; 23 | while(num--) { 24 | int flag = 0; 25 | set s; 26 | for(int i = 1; i <= n; i++) { 27 | cin >> color[i]; 28 | s.insert(color[i]); 29 | } 30 | if(s.size() != k ) { 31 | flag = 1; 32 | cout << "No\n"; 33 | }else { 34 | for(int i = 1; i <= n; i++) { 35 | if(f(i) == false) { 36 | cout << "No\n"; 37 | flag = 1; 38 | break; 39 | } 40 | } 41 | } 42 | if(flag == 0) cout << "Yes\n"; 43 | } 44 | return 0; 45 | } 46 | -------------------------------------------------------------------------------- /L2-024 部落.cpp: -------------------------------------------------------------------------------- 1 | L2-024 部落(25 分) 2 | 在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈。我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部落?并且检查任意两个人是否属于同一个部落。 3 | 4 | 输入格式: 5 | 输入在第一行给出一个正整数N(<= 10^4^),是已知小圈子的个数。随后N行,每行按下列格式给出一个小圈子里的人: 6 | K P[1] P[2] ... P[K] 7 | 其中K是小圈子里的人数,P[i](i=1, .., K)是小圈子里每个人的编号。这里所有人的编号从1开始连续编号,最大编号不会超过10^4^。 8 | 之后一行给出一个非负整数Q(<= 10^4^),是查询次数。随后Q行,每行给出一对被查询的人的编号。 9 | 10 | 输出格式: 11 | 首先在一行中输出这个社区的总人数、以及互不相交的部落的个数。随后对每一次查询,如果他们属于同一个部落,则在一行中输出“Y”,否则输出“N”。 12 | 13 | 输入样例: 14 | 4 15 | 3 10 1 2 16 | 2 3 4 17 | 4 1 5 7 8 18 | 3 9 6 4 19 | 2 20 | 10 5 21 | 3 7 22 | 输出样例: 23 | 10 2 24 | Y 25 | N 26 | 27 | 28 | #include 29 | #include 30 | using namespace std; 31 | int father[10010]; 32 | int findFather(int x) { 33 | while (x != father[x]) 34 | x = father[x]; 35 | return x; 36 | } 37 | set total; 38 | void unionFather(int a, int b) { 39 | total.insert(a); 40 | total.insert(b); 41 | int fa = findFather(a), fb = findFather(b); 42 | if (fa < fb) father[fb] = fa; 43 | else father[fa] = fb; 44 | } 45 | int main() { 46 | for (int i = 0; i <= 10000; i++) father[i] = i; 47 | int n, k, t, s, q; 48 | scanf("%d", &n); 49 | for (int i = 0; i < n; i++) { 50 | scanf("%d %d", &k, &t); 51 | if (k == 1) unionFather(t, t); 52 | for (int j = 1; j < k; j++) { 53 | scanf("%d",&s); 54 | unionFather(t, s); 55 | } 56 | } 57 | set cnt; 58 | for (auto it = total.begin(); it != total.end(); it++) 59 | cnt.insert(findFather(*it)); 60 | printf("%lu %lu\n", total.size(), cnt.size()); 61 | scanf("%d", &q); 62 | for (int i = 0; i < q; i++) { 63 | scanf("%d %d", &t, &s); 64 | printf("%c\n", findFather(t) == findFather(s) ? 'Y' : 'N'); 65 | } 66 | return 0; 67 | } 68 | -------------------------------------------------------------------------------- /L2-025 分而治之.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int n, m, k, aa[10010] = {0}, a[10010]; 5 | void check() { 6 | for(int i = 1; i <= n; i++) { 7 | if(a[i] > 0) { 8 | cout << "NO\n"; 9 | return ; 10 | } 11 | } 12 | cout << "YES\n"; 13 | return ; 14 | } 15 | int main(){ 16 | cin >> n >> m; 17 | vector> v(n+1); 18 | while(m--) { 19 | int c1, c2; 20 | cin >> c1 >> c2; 21 | aa[c1]++; 22 | aa[c2]++; 23 | v[c1].push_back(c2); 24 | v[c2].push_back(c1); 25 | } 26 | cin >> k; 27 | while(k--) { 28 | int cnt, num; 29 | cin >> cnt; 30 | for(int i = 1; i <= n; i++) 31 | a[i] = aa[i]; 32 | for(int i = 0; i < cnt; i++) { 33 | cin >> num; 34 | a[num] = 0; 35 | for(int j = 0; j < v[num].size(); j++) 36 | a[v[num][j]]--; 37 | } 38 | check(); 39 | } 40 | return 0; 41 | } 42 | -------------------------------------------------------------------------------- /L2-026 小字辈.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | struct peo{ 6 | int id, level; 7 | }; 8 | int main(){ 9 | int n, temp, maxlevel = -1; 10 | queue q; 11 | vector ans; 12 | cin >> n; 13 | vector> v(n+1); 14 | for(int i = 1; i <= n; i++) { 15 | cin >> temp; 16 | if(temp == -1) temp = 0; 17 | v[temp].push_back(i); 18 | } 19 | q.push({0,0}); 20 | while(!q.empty()) { 21 | peo p = q.front(); 22 | int id = p.id, level = p.level; 23 | if(p.level > maxlevel) maxlevel = p.level; 24 | ans.push_back(p); 25 | q.pop(); 26 | for(int i = 0; i < v[id].size(); i++) 27 | q.push({v[id][i], level + 1}); 28 | } 29 | cout << maxlevel << endl; 30 | for(int i = 0; i < ans.size(); i++) { 31 | if(ans[i].level == maxlevel) { 32 | cout << ans[i].id; 33 | if(i != ans.size() - 1) cout << " "; 34 | } 35 | } 36 | return 0; 37 | } -------------------------------------------------------------------------------- /L2-027 名人堂与代金券.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | struct peo{ 6 | string name; 7 | int sco; 8 | }; 9 | bool cmp(peo a, peo b) { 10 | if(a.sco != b.sco) return a.sco > b.sco; 11 | return a.name < b.name; 12 | } 13 | int main(){ 14 | int n, g, k, sum = 0, rank[10001] = {0}; 15 | cin >> n >> g >> k; 16 | vector v(n); 17 | for(int i = 0; i < n; i++) { 18 | cin >> v[i].name >> v[i].sco; 19 | if(v[i].sco >= 60) sum += 20; 20 | if(v[i].sco >= g) sum += 30; 21 | } 22 | sort(v.begin(), v.end(), cmp); 23 | rank[0] = 1; 24 | for(int i = 1; i < n; i++) { 25 | if(v[i].sco == v[i-1].sco) 26 | rank[i] = rank[i-1]; 27 | else 28 | rank[i] = i + 1; 29 | } 30 | cout << sum << endl; 31 | for(int i = 0; rank[i] <= k && i < n; i++) 32 | printf("%d %s %d\n", rank[i], v[i].name.c_str(), v[i].sco); 33 | return 0; 34 | } 35 | -------------------------------------------------------------------------------- /L2-028 秀恩爱分得快.cpp: -------------------------------------------------------------------------------- 1 | L2-028 秀恩爱分得快(25 分) 2 | 古人云:秀恩爱,分得快。 3 | 互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度。如果一张照片上出现了 K 个人,这些人两两间的亲密度就被定义为 1/K。任意两个人如果同时出现在若干张照片里,他们之间的亲密度就是所有这些同框照片对应的亲密度之和。下面给定一批照片,请你分析一对给定的情侣,看看他们分别有没有亲密度更高的异性朋友? 4 | 输入格式: 5 | 输入在第一行给出 2 个正整数:N(不超过1000,为总人数——简单起见,我们把所有人从 0 到 N-1 编号。为了区分性别,我们用编号前的负号表示女性)和 M(不超过1000,为照片总数)。随后 M 行,每行给出一张照片的信息,格式如下: 6 | K P[1] ... P[K] 7 | 其中 K(<= 500)是该照片中出现的人数,P[1] ~ P[K] 就是这些人的编号。最后一行给出一对异性情侣的编号 A 和 B。同行数字以空格分隔。题目保证每个人只有一个性别,并且不会在同一张照片里出现多次。 8 | 输出格式: 9 | 首先输出“A PA”,其中 PA 是与 A 最亲密的异性。如果 PA 不唯一,则按他们编号的绝对值递增输出;然后类似地输出“B PB”。但如果 A 和 B 正是彼此亲密度最高的一对,则只输出他们的编号,无论是否还有其他人并列。 10 | 输入样例 1: 11 | 10 4 12 | 4 -1 2 -3 4 13 | 4 2 -3 -5 -6 14 | 3 2 4 -5 15 | 3 -6 0 2 16 | -3 2 17 | 输出样例 1: 18 | -3 2 19 | 2 -5 20 | 2 -6 21 | 输入样例 2: 22 | 4 4 23 | 4 -1 2 -3 0 24 | 2 0 -3 25 | 2 2 -3 26 | 2 -1 2 27 | -3 2 28 | 输出样例 2: 29 | -3 2 30 | 31 | 分析:1.此题考查的是对 0 -0 的特殊处理。当遇到 0 时候把此人转为1000存储, 所以读数据的时候要以字符串形式读取 32 | 2.遍历每张照片,把与男主女主对应的异性亲密度用sum数字累加起来, 并维护maxn[1] maxn[2], 为男主女主的最亲密值 和ans[1], ans[2]容器,为最亲密异性id。 33 | 3.判断男主女主是否互为最亲密,如果是,输出并return 0, 否则分别输出他们的最亲密好友 34 | 4.注意输出时候,因为把0当1000存储,会导致0号人排在最后,这是不符题意的,输出之前排个序,让1000排在最前面 35 | 36 | #include 37 | #include 38 | #include 39 | #include 40 | using namespace std; 41 | bool cmp (int a, int b) { 42 | if(abs(a) == 1000) return true; 43 | if(abs(b) == 1000) return false; 44 | return abs(a) < abs(b); 45 | } 46 | int main(){ 47 | int n, m, num, k, sex[1010] = {0}, love[3]; 48 | double sum[1010] = {0}, maxn[3] = {0} ; 49 | string s; 50 | cin >> n >> m; 51 | vector> v(m), ans(3); 52 | for(int i = 0; i < m; i++) { 53 | cin >> k; 54 | for(int j = 0; j < k; j++){ 55 | cin >> s; 56 | if(s == "0") s = "1000"; 57 | if(s == "-0") s = "-1000"; 58 | num = stoi(s); 59 | sex[abs(num)] = num; 60 | v[i].push_back(num); 61 | } 62 | } 63 | for(int i = 1; i <= 2; i++) { 64 | cin >> s; 65 | if(s == "0") s = "1000"; 66 | if(s == "-0") s = "-1000"; 67 | love[i] = stoi(s); 68 | } 69 | for(int k = 1; k <= 2; k++) { 70 | for(int i = 0; i < m; i++) { 71 | int flag = 0; 72 | for(int j = 0; j < v[i].size(); j++){ 73 | if(v[i][j] == love[k]) { 74 | flag = 1; 75 | break; 76 | } 77 | } 78 | if(flag == 1) { 79 | for(int j = 0; j < v[i].size(); j++){ 80 | if(love[k] * v[i][j] < 0) { 81 | sum[(int)abs(v[i][j])] += 1.0 / v[i].size(); 82 | } 83 | } 84 | } 85 | } 86 | } 87 | maxn[1] = maxn[2] = -1; 88 | for(int k = 1; k <= 2; k++) { 89 | for(int i = 1; i <= 1000; i++) { 90 | if(love[k] * sex[i] < 0) { 91 | if(sum[i] > maxn[k]) { 92 | maxn[k] = sum[i]; 93 | ans[k].clear(); 94 | ans[k].push_back(sex[i]); 95 | }else if(sum[i] == maxn[k]) { 96 | ans[k].push_back(sex[i]); 97 | } 98 | } 99 | } 100 | } 101 | if(maxn[1] == sum[(int)abs(love[2])] && maxn[2] == sum[(int)abs(love[1])]) { 102 | string s1 = to_string(love[1]), s2 = to_string(love[2]); 103 | if(love[1] == 1000) s1 = "0"; 104 | if(love[1] == -1000) s1 = "-0"; 105 | if(love[2] == 1000) s2 = "0"; 106 | if(love[2] == -1000) s2 = "-0"; 107 | cout << s1 << " " << s2 << endl; 108 | return 0; 109 | } 110 | for(int k = 1; k <= 2; k++) { 111 | sort(ans[k].begin(), ans[k].end(), cmp); 112 | for(int i = 0; i < ans[k].size(); i++) { 113 | string s1 = to_string(love[k]), s2 = to_string(ans[k][i]); 114 | if(love[k] == 1000) s1 = "0"; 115 | if(love[k] == -1000) s1 = "-0"; 116 | if(ans[k][i] == 1000) s2 = "0"; 117 | if(ans[k][i] == -1000) s2 = "-0"; 118 | cout << s1 << " " << s2 << endl; 119 | } 120 | } 121 | return 0; 122 | } -------------------------------------------------------------------------------- /L2-029 特立独行的幸福.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int A, B, flag, num[10001], notIndep[10001]; 4 | bool isPrime(int a) { 5 | if (a == 1) return false; 6 | for (int i = 2; i <= sqrt(a); i++) 7 | if (a % i == 0) return false; 8 | return true; 9 | } 10 | bool isIndep(int x) { 11 | set mark; 12 | int X = x, temp1, temp2; 13 | while (X != 1) { 14 | mark.insert(X); 15 | temp1 = 0; 16 | while (X) { 17 | temp2 = X % 10; 18 | X /= 10; 19 | temp1 += temp2 * temp2; 20 | } 21 | num[x]++; 22 | notIndep[temp1] = 1; 23 | X = temp1; 24 | if (mark.count(X)) return false; 25 | } 26 | return true; 27 | } 28 | int main() { 29 | cin >> A >> B; 30 | vector ans; 31 | for (int i = A; i <= B; i++) 32 | if (isIndep(i)) ans.push_back(i); 33 | for (int i = 0; i < ans.size(); i++) { 34 | if (isPrime(ans[i])) num[ans[i]] <<= 1; 35 | if (!notIndep[ans[i]]) { 36 | cout << ans[i] << ' ' << num[ans[i]] << endl; 37 | flag = 1; 38 | } 39 | } 40 | if (!flag) cout << "SAD"; 41 | return 0; 42 | } -------------------------------------------------------------------------------- /L2-030 冰岛人.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | #define pis pair 4 | int N, M; 5 | string fName, sName, temp; 6 | map Record; 7 | string check(string a, string b) { 8 | int cnt1 = 0, cnt2; 9 | while (a != "") { 10 | cnt2 = 0; 11 | string b2 = b; 12 | while (b2 != "") { 13 | if (a == b2 && (cnt1 < 4 || cnt2 < 4)) return "No\n"; 14 | if (cnt1 >= 4 && cnt2 >= 4) return "Yes\n"; 15 | b2 = Record[b2].second; 16 | cnt2++; 17 | } 18 | a = Record[a].second; 19 | cnt1++; 20 | } 21 | return "Yes\n"; 22 | } 23 | int main() { 24 | cin >> N; 25 | while(N--){ 26 | cin >> fName >> sName; 27 | if (sName.back() == 'n') Record[fName] = {1, sName.substr(0, sName.length() - 4)}; 28 | else if (sName.back() == 'r') Record[fName] = {0, sName.substr(0, sName.length() - 7)}; 29 | else if (sName.back() == 'm') Record[fName].first = 1; 30 | else Record[fName].first = 0; 31 | } 32 | cin >> M; 33 | while(M--){ 34 | cin >> fName >> temp >> sName >> temp; 35 | if (!Record.count(fName) || !Record.count(sName)) cout << "NA\n"; 36 | else if(Record[fName].first == Record[sName].first) cout << "Whatever\n"; 37 | else cout << check(fName, sName); 38 | } 39 | return 0; 40 | } -------------------------------------------------------------------------------- /L2-031 深入虎穴.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | #define pii pair 4 | int N, K, D, one, vis[100001]; 5 | vector Edge[100001]; 6 | queue Q; 7 | int main() { 8 | cin >> N; 9 | for (int i = 1; i <= N; ++i) { 10 | cin >> K; 11 | while(K--) { 12 | cin >> D; 13 | Edge[D].push_back(i); 14 | Edge[i].push_back(D); 15 | } 16 | } 17 | Q.push(1); 18 | vis[1] = 1; 19 | while(!Q.empty()) { 20 | one = Q.front(); 21 | Q.pop(); 22 | for (auto v:Edge[one]) { 23 | if (vis[v]) continue; 24 | vis[v] = 1; 25 | Q.push(v); 26 | } 27 | } 28 | cout << one; 29 | return 0; 30 | } -------------------------------------------------------------------------------- /L2-032 彩虹瓶.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int N, M, K, temp, need, num, Stack[1002]; 4 | int main() { 5 | cin >> N >> M >> K; 6 | for (int i = 0; i < K; i++) { 7 | need = 1, num = 1; 8 | for (int j = 0; j < N; j++) { 9 | cin >> temp; 10 | if (temp == need) { 11 | need++; 12 | while (Stack[num - 1] == need) need++, num--; 13 | } else if (num <= M) Stack[num++] = temp; 14 | } 15 | printf("%s\n", num == 1 ? "YES" : "NO"); 16 | } 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /L2-033 简单计算器.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int n, In[1000], Sum; 4 | char oper, Record[100]; 5 | int main() { 6 | cin >> n; 7 | for (int i = n - 1; i >= 0; i--) cin >> In[i]; 8 | for (int i = n - 1; i > 0; i--) cin >> Record[i]; 9 | Sum = In[0]; 10 | for (int i = 1; i < n; i++) { 11 | oper = Record[i]; 12 | if (oper == '+') Sum = In[i] + Sum; 13 | else if (oper == '-') Sum = In[i] - Sum; 14 | else if (oper == '*') Sum = In[i] * Sum; 15 | else { 16 | if (Sum == 0) { 17 | cout << "ERROR: " << In[i] << "/0"; 18 | return 0; 19 | } 20 | Sum = In[i] / Sum; 21 | } 22 | } 23 | cout << (int)Sum; 24 | return 0; 25 | } -------------------------------------------------------------------------------- /L2-034 口罩发放.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | struct node { 4 | string name, id, Time; 5 | int illness, order; 6 | }; 7 | bool isIllegal(const string &ss) { 8 | if (ss.size() != 18) return true; 9 | for (char i:ss) if (i < '0' || i > '9') return true; 10 | return false; 11 | } 12 | bool cmp (const node &a,const node &b) { 13 | if (a.Time != b.Time) return a.Time < b.Time; 14 | return a.order < b.order; 15 | } 16 | vector Record, ill; 17 | int D, P, t, s, providedNum; 18 | map lastGet; 19 | set gotten; 20 | int main() { 21 | cin >> D >> P; 22 | for (int i = 1; i <= D; i++) { 23 | cin >> t >> s; 24 | Record.resize(t); 25 | providedNum = 0; 26 | for (int j = 0; j < t; j++) { 27 | cin >> Record[j].name >> Record[j].id >> Record[j].illness >> Record[j].Time; 28 | Record[j].order = j; 29 | if (isIllegal(Record[j].id)) Record[j].name = ""; 30 | else { 31 | if (!lastGet.count(Record[j].id)) lastGet[Record[j].id] = -30; 32 | if (Record[j].illness == 1 && !gotten.count(Record[j].id)) { 33 | ill.push_back(Record[j]); 34 | gotten.insert(Record[j].id); 35 | } 36 | } 37 | } 38 | sort(Record.begin(), Record.end(), cmp); 39 | for (int j = 0; j < t && providedNum < s; j++) { 40 | if (Record[j].name != "" && i - lastGet[Record[j].id] > P) { 41 | lastGet[Record[j].id] = i; 42 | providedNum++; 43 | cout << Record[j].name << ' ' << Record[j].id << endl; 44 | } 45 | } 46 | } 47 | for (node i:ill) cout << i.name << ' ' << i.id << '\n'; 48 | return 0; 49 | } -------------------------------------------------------------------------------- /L2-035 完全二叉树的层序遍历.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int n, cnt, In[32], dfs[32]; 4 | void Func(int index) { 5 | if (index > n) return; 6 | Func(index << 1); 7 | Func(index << 1 | 1); 8 | dfs[index] = In[cnt++]; 9 | } 10 | int main() { 11 | cin >> n; 12 | for (int i = 0; i < n; i++) cin >> In[i]; 13 | Func(1); 14 | cout << dfs[1]; 15 | for (int i = 2; i <= n; i++) cout << ' ' << dfs[i]; 16 | return 0; 17 | } -------------------------------------------------------------------------------- /L2-036 网红点打卡攻略.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int N, M, K, u, v, w, n, flag, cost, Ansnum, Ansid, Anscost = INT_MAX, Edge[201][201], Path[202], Has[201]; 4 | int main() { 5 | cin >> N >> M; 6 | for (int i = 0; i < M; i++) { 7 | cin >> u >> v >> w; 8 | Edge[u][v] = Edge[v][u] = w; 9 | } 10 | cin >> K; 11 | for (int i = 1; i <= K; i++) { 12 | fill(Has, Has + N + 1, 0); 13 | Path[N + 1] = flag = cost = 0; 14 | cin >> n; 15 | for (int j = 1; j <= n; j++){ 16 | cin >> Path[j]; 17 | if(Has[Path[j]]) Has[0] = 1; 18 | Has[Path[j]] = 1; 19 | } 20 | if (Has[0] || n != N) continue; 21 | for (int j = 1; j <= n + 1; j++) { 22 | if (Edge[Path[j-1]][Path[j]] == 0) { 23 | flag = 1; 24 | break; 25 | } 26 | cost += Edge[Path[j - 1]][Path[j]]; 27 | } 28 | if (!flag) { 29 | Ansnum++; 30 | if(cost < Anscost) Ansid = i, Anscost = cost; 31 | } 32 | } 33 | cout << Ansnum << '\n' << Ansid << ' ' << Anscost; 34 | return 0; 35 | } -------------------------------------------------------------------------------- /L2-037 包装机.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int n, m, s, c; 4 | queue Q[1005]; 5 | stack St; 6 | int main() { 7 | cin >> n >> m >> s; 8 | for (int i = 1; i <= n; i++) { 9 | string t; 10 | cin >> t; 11 | for (int j = 0; j < m; j++) Q[i].push(t[j]); 12 | } 13 | while (cin >> c) { 14 | if (c == -1) break; 15 | if (c == 0) { 16 | if (St.empty()) continue; 17 | cout << St.top(); 18 | St.pop(); 19 | } else { 20 | if (Q[c].empty()) continue; 21 | if (St.size() == s) { 22 | cout << St.top(); 23 | St.pop(); 24 | } 25 | St.push(Q[c].front()); 26 | Q[c].pop(); 27 | } 28 | } 29 | return 0; 30 | } -------------------------------------------------------------------------------- /L2-038 病毒溯源.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | #define pii pair 4 | int n, k, t, S, Long = 0, ans, in[10005], pa[10005]; 5 | vector F, Edge[10005]; 6 | queue Q; 7 | int main() { 8 | cin >> n; 9 | for (int i = 0; i < n; i++) { 10 | cin >> k; 11 | for (int j = 0; j < k; j++) { 12 | cin >> t; 13 | in[t]++; 14 | pa[t] = i; 15 | Edge[i].push_back(t); 16 | } 17 | sort(Edge[i].begin(), Edge[i].end()); 18 | } 19 | for (int i = 0; i < n; i++) if (in[i] == 0) S = i; 20 | while(!Q.empty()) Q.pop(); 21 | Q.push({S, 1}); 22 | while (!Q.empty()) { 23 | int now = Q.front().first, D = Q.front().second; 24 | Q.pop(); 25 | if (D > Long) { 26 | Long = D; 27 | ans = now; 28 | } 29 | for (auto nex : Edge[now]) Q.push({nex, D + 1}); 30 | } 31 | cout << Long << '\n'; 32 | while (ans != S) { 33 | F.push_back(ans); 34 | ans = pa[ans]; 35 | } 36 | F.push_back(S); 37 | for (int i = F.size() - 1; ~i; --i) { 38 | cout << F[i]; 39 | if (i != 0) cout << ' '; 40 | } 41 | return 0; 42 | } -------------------------------------------------------------------------------- /L2-039 清点代码库.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int n, m, t; 4 | vector temp; 5 | map, int> A; 6 | multimap, greater > B; 7 | int main() { 8 | scanf("%d%d", &n, &m); 9 | temp.resize(m); 10 | for (int i = 0; i < n; i++) { 11 | for (int j = 0; j < m; j++) scanf("%d", &temp[j]); 12 | A[temp]++; 13 | } 14 | for (auto it : A) B.insert({it.second, it.first}); 15 | printf("%d\n", A.size()); 16 | for (auto it : B) { 17 | printf("%d", it.first); 18 | for (auto it2 : it.second) printf(" %d", it2); 19 | printf("\n"); 20 | } 21 | return 0; 22 | } -------------------------------------------------------------------------------- /L2-040 哲哲打游戏.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | struct node { 4 | int pos; 5 | vector Path; 6 | }; 7 | int n, m, now = 1; 8 | vector temp, Edge[100005]; 9 | vector Save(105); 10 | int main() { 11 | scanf("%d%d", &n, &m); 12 | for (int i = 1; i <= n; i++) { 13 | int k; 14 | scanf("%d", &k); 15 | for (int j = 0; j < k; j++) { 16 | int t2; 17 | scanf("%d", &t2); 18 | Edge[i].push_back(t2); 19 | } 20 | } 21 | temp.push_back(1); 22 | for (int i = 1; i <= m; i++) { 23 | int c, J; 24 | scanf("%d%d", &c, &J); 25 | if (c == 0) { 26 | temp.push_back(Edge[now][J-1]); 27 | now = Edge[now][J - 1]; 28 | } else if (c == 1) { 29 | Save[J].pos = now; 30 | Save[J].Path = temp; 31 | printf("%d\n", now); 32 | } else { 33 | now = Save[J].pos; 34 | temp = Save[J].Path; 35 | } 36 | } 37 | printf("%d", temp.back()); 38 | return 0; 39 | } -------------------------------------------------------------------------------- /L2-041 插松枝.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int N, M, K, tui; 6 | stack he; 7 | vector temp; 8 | void outprint() { 9 | for (int i = 0; i < temp.size(); i++) { 10 | if (i) cout << ' '; 11 | cout << temp[i]; 12 | } 13 | cout << '\n'; 14 | temp.clear(); 15 | } 16 | int main() { 17 | cin >> N >> M >> K; 18 | for (int i = 0; i < N; i++) { 19 | cin >> tui; 20 | tuihaimeiyong: 21 | while (!he.empty()) { 22 | if (temp.empty() || he.top() <= temp.back()) { 23 | temp.push_back(he.top()); 24 | he.pop(); 25 | } 26 | else break; 27 | if (temp.size() == K) outprint(); 28 | } 29 | if (temp.empty() || tui <= temp.back()) temp.push_back(tui); 30 | else if(he.size() < M) he.push(tui); 31 | else { 32 | outprint(); 33 | goto tuihaimeiyong; 34 | } 35 | if (temp.size() == K) outprint(); 36 | } 37 | while(!he.empty()) { 38 | if (temp.empty() || he.top() <= temp.back()) { 39 | temp.push_back(he.top()); 40 | he.pop(); 41 | } 42 | else outprint(); 43 | if (temp.size() == K) outprint(); 44 | } 45 | for (int j = 0; j < temp.size(); j++) { 46 | if (j) cout << ' '; 47 | cout << temp[j]; 48 | } 49 | return 0; 50 | } -------------------------------------------------------------------------------- /L2-042 老板的作息表.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | set > record; 5 | string work_start_time, work_end_time, last_start = "00:00:00"; 6 | int main() { 7 | cin >> work_start_time; 8 | while (cin >> work_start_time >> work_end_time >> work_end_time) record.insert({work_start_time, work_end_time}); 9 | record.insert({"23:59:59", ""}); 10 | for (auto ite : record) { 11 | if (last_start < ite.first) cout << last_start << " - " << ite.first << '\n'; 12 | last_start = ite.second; 13 | } 14 | return 0; 15 | } -------------------------------------------------------------------------------- /L2-043 龙龙送外卖.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int N, M, Parent_num, new_address, passed_close_to_root, Round, Longest_path, Parent[100001], mark[100001], Distance[100001]; 5 | vector Child[100001]; 6 | queue > Q; 7 | int main() { 8 | cin >> N >> M; 9 | for (int i = 1; i <= N; i++) { 10 | cin >> Parent_num; 11 | if (Parent_num < 0) Parent[0] = i; 12 | else Child[Parent_num].push_back(i); 13 | Parent[i] = Parent_num; 14 | } 15 | mark[Parent[0]] = 1; 16 | Q.push({Parent[0], 0}); 17 | while(!Q.empty()) { 18 | int id = Q.front().first, deep = Q.front().second; 19 | Q.pop(); 20 | Distance[id] = deep; 21 | for (auto ite : Child[id]) Q.push({ite, deep + 1}); 22 | } 23 | for (int i = 0; i < M; i++) { 24 | cin >> new_address; 25 | passed_close_to_root = new_address; 26 | while(!mark[passed_close_to_root]) { 27 | mark[passed_close_to_root] = 1; 28 | passed_close_to_root = Parent[passed_close_to_root]; 29 | } 30 | Round += Distance[new_address] - Distance[passed_close_to_root]; 31 | Longest_path = max(Longest_path, Distance[new_address]); 32 | cout << Round * 2 - Longest_path * 1 << '\n'; 33 | } 34 | return 0; 35 | } -------------------------------------------------------------------------------- /L2-044 大众情人.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | using namespace std; 6 | int N, Dis[501][501]; 7 | char c; 8 | vector Nan, Nv; 9 | map > M_Ans, F_Ans; 10 | void findlover(vector &Find, vector &Base, map > &Target, int mark = 0) { 11 | for (int i = 0, score = 0; i < (int)Find.size(); i++, score = 0) { 12 | for (int j = 0; j < (int)Base.size(); j++) score = max(score, Dis[Base[j]][Find[i]]); 13 | Target[score].insert(Find[i]); 14 | } 15 | for (auto ite : Target.begin()->second) { 16 | if (mark++) cout << ' '; 17 | cout << ite; 18 | } 19 | } 20 | int main() { 21 | cin >> N; 22 | fill (Dis[0], Dis[0] + 501 * 501, 1e9); 23 | for (int i = 1, K, fri, dis; i <= N; i++) { 24 | cin >> c >> K; 25 | if (c == 'F') Nv.push_back(i); 26 | else Nan.push_back(i); 27 | for (int j = 0; j < K; ++j) { 28 | cin >> fri >> c >> dis; 29 | Dis[i][fri] = dis; 30 | } 31 | } 32 | for (int k = 1; k <= N; k++) 33 | for (int i = 1; i <= N; i++) 34 | for (int j = 1; j <= N; j++) 35 | Dis[i][j] = min(Dis[i][j], Dis[i][k] + Dis[k][j]); 36 | findlover(Nv, Nan, F_Ans); 37 | cout << '\n'; 38 | findlover(Nan, Nv, M_Ans); 39 | return 0; 40 | } -------------------------------------------------------------------------------- /L2-045 堆宝塔.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int N, A[1005], B[1005], a, b, c, num, mt; 4 | int main() { 5 | cin >> N; 6 | while (N--) { 7 | cin >> c; 8 | if (a == 0 || A[a] > c) { 9 | A[++a] = c; 10 | } else if (b == 0 || B[b] < c) { 11 | B[++b] = c; 12 | } else { 13 | mt = max(mt, a); 14 | a = 0; 15 | num++; 16 | while (b && B[b] > c) { 17 | A[++a] = B[b--]; 18 | } 19 | A[++a] = c; 20 | } 21 | } 22 | mt = max(mt, a); 23 | if (b) ++num; 24 | cout << num + 1 << ' ' << mt; 25 | return 0; 26 | } -------------------------------------------------------------------------------- /L2-046 天梯赛的赛场安排.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | using namespace std; 6 | priority_queue> Q; 7 | int N, C, t, room[500000], r, num, f; 8 | map Num; 9 | vector Uni(5005); 10 | int main() { 11 | cin >> N >> C; 12 | for (int i = 1; i <= N; i++) { 13 | cin >> Uni[i] >> t; 14 | Q.push({t, Uni[i]}); 15 | } 16 | while(Q.size()) { 17 | string SN = Q.top().second; 18 | num = Q.top().first; 19 | Q.pop(); 20 | Num[SN]++; 21 | if (num >= C) { 22 | room[++r] = 0; 23 | if(num != C) Q.push({num - C, SN}); 24 | } else { 25 | f = 0; 26 | for (int i = 1; i <= r; i++) { 27 | if (room[i] >= num) { 28 | room[i] -= num; 29 | f = 1; 30 | break; 31 | } 32 | } 33 | if (!f) { 34 | room[++r] = C - num; 35 | } 36 | } 37 | } 38 | for (int i = 1; i <= N; i++) cout << Uni[i] << ' ' << Num[Uni[i]] << '\n'; 39 | cout << r; 40 | return 0; 41 | } -------------------------------------------------------------------------------- /L2-047 锦标赛.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int k, w, lost[19][1 << 18], win[19][1 << 18], ans[1 << 18]; 4 | int main() { 5 | cin >> k; 6 | for (int i = 1; i <= k; i++) { 7 | for (int j = 0; j < (1 << (k - i)); j++) { 8 | cin >> lost[i][j]; 9 | if (i == 1) { 10 | ans[j << 1] = lost[i][j]; 11 | win[i][j] = j << 1 | 1; 12 | } else { 13 | if (lost[i][j] < lost[i - 1][j << 1] && lost[i][j] < lost[i - 1][j << 1 | 1]) { 14 | cout << "No Solution"; 15 | return 0; 16 | } else if (lost[i][j] >= lost[i - 1][j << 1]) { 17 | ans[win[i - 1][j << 1]] = lost[i][j]; 18 | win[i][j] = win[i - 1][j << 1 | 1]; 19 | } else { 20 | ans[win[i - 1][j << 1 | 1]] = lost[i][j]; 21 | win[i][j] = win[i - 1][j << 1]; 22 | } 23 | lost[i][j] = max(lost[i][j], max(lost[i - 1][j << 1], lost[i - 1][j << 1 | 1])); 24 | } 25 | } 26 | } 27 | cin >> w; 28 | if(lost[k][0] > w) { 29 | cout << "No Solution"; 30 | return 0; 31 | } 32 | ans[win[k][0]] = w; 33 | for (int i = 0; i < 1 << k; i++) { 34 | if (i) cout << ' '; 35 | cout << ans[i] ; 36 | } 37 | return 0; 38 | } -------------------------------------------------------------------------------- /L2-048 寻宝图.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int N, M, island, precious, p, NX[4] = {1, -1, 0, 0}, NY[4] = {0, 0, 1, -1}; 5 | string A[100005]; 6 | queue> Q; 7 | int main() { 8 | cin >> N >> M; 9 | for (int i = 0; i < N; i++) cin >> A[i]; 10 | for (int i = 0; i < N; i++) 11 | for (int j = 0; j < M; j++) { 12 | if (A[i][j] != '0') { 13 | ++island; 14 | Q.push({i, j}); 15 | p = 0; 16 | if(A[i][j] >= '2') p = 1; 17 | A[i][j] = '0'; 18 | while(Q.size()) { 19 | int nowx = Q.front().first, nowy = Q.front().second; 20 | Q.pop(); 21 | for (int k = 0; k < 4; k++) { 22 | int X = nowx + NX[k], Y = nowy + NY[k]; 23 | if(X >= 0 && X < N && Y >= 0 && Y < M && A[X][Y] >= '1') { 24 | if(A[X][Y] >= '2') p = 1; 25 | Q.push({X, Y}); 26 | A[X][Y] = '0'; 27 | } 28 | } 29 | } 30 | if(p) ++precious; 31 | } 32 | } 33 | cout << island << ' ' << precious; 34 | return 0; 35 | } -------------------------------------------------------------------------------- /L3-001 凑零钱.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int dp[10010]; 6 | int w[10010]; 7 | bool choice[10010][10010]; 8 | int cmp1(int a, int b){return a > b;} 9 | int main() { 10 | int n, m; 11 | scanf("%d%d", &n, &m); 12 | for(int i = 1; i <= n; i++) 13 | scanf("%d", &w[i]); 14 | sort(w + 1, w + n + 1, cmp1); 15 | for(int i = 1; i <= n; i++) { 16 | for(int j = m; j >= w[i]; j--) { 17 | if(dp[j] <= dp[j-w[i]] + w[i]) { 18 | choice[i][j] = true; 19 | dp[j] = dp[j-w[i]] + w[i]; 20 | } 21 | } 22 | } 23 | if(dp[m] != m) printf("No Solution"); 24 | else { 25 | vector arr; 26 | int v = m, index = n; 27 | while(v > 0) { 28 | if(choice[index][v] == true) { 29 | arr.push_back(w[index]); 30 | v -= w[index]; 31 | } 32 | index--; 33 | } 34 | for(int i = 0; i < arr.size(); i++) { 35 | if(i != 0) printf(" "); 36 | printf("%d", arr[i]); 37 | } 38 | } 39 | return 0; 40 | } -------------------------------------------------------------------------------- /L3-002 堆栈.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #define lowbit(i) ((i) & (-i)) 4 | const int maxn = 100010; 5 | using namespace std; 6 | int c[maxn]; 7 | stack s; 8 | void update(int x, int v) { 9 | for(int i = x; i < maxn; i += lowbit(i)) 10 | c[i] += v; 11 | } 12 | int getsum(int x) { 13 | int sum = 0; 14 | for(int i = x; i >= 1; i -= lowbit(i)) 15 | sum += c[i]; 16 | return sum; 17 | } 18 | void PeekMedian() { 19 | int left = 1, right = maxn, mid, k = (s.size() + 1) / 2; 20 | while(left < right) { 21 | mid = (left + right) / 2; 22 | if(getsum(mid) >= k) 23 | right = mid; 24 | else 25 | left = mid + 1; 26 | } 27 | printf("%d\n", left); 28 | } 29 | int main() { 30 | int n, temp; 31 | scanf("%d", &n); 32 | char str[15]; 33 | for(int i = 0; i < n; i++) { 34 | scanf("%s", str); 35 | if(str[1] == 'u') { 36 | scanf("%d", &temp); 37 | s.push(temp); 38 | update(temp, 1); 39 | } else if(str[1] == 'o') { 40 | if(!s.empty()) { 41 | update(s.top(), -1); 42 | printf("%d\n", s.top()); 43 | s.pop(); 44 | } else { 45 | printf("Invalid\n"); 46 | } 47 | } else { 48 | if(!s.empty()) 49 | PeekMedian(); 50 | else 51 | printf("Invalid\n"); 52 | } 53 | } 54 | return 0; 55 | } 56 | 57 | -------------------------------------------------------------------------------- /L3-003 社交集群.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | vector father, isRoot; 6 | int cmp1(int a, int b){ 7 | return a > b; 8 | } 9 | int findFather(int x) { 10 | int a = x; 11 | while(x != father[x]) 12 | x = father[x]; 13 | while(a != father[a]) { 14 | int z = a; 15 | a = father[a]; 16 | father[z] = x; 17 | } 18 | return x; 19 | } 20 | void Union(int a, int b) { 21 | int faA = findFather(a); 22 | int faB = findFather(b); 23 | if(faA != faB) 24 | father[faA] = faB; 25 | } 26 | int main() { 27 | int n, k, t, cnt = 0; 28 | int course[1001] = {0}; 29 | scanf("%d", &n); 30 | father.resize(n + 1); 31 | isRoot.resize(n + 1); 32 | for(int i = 1; i <= n; i++) 33 | father[i] = i; 34 | for(int i = 1; i <= n; i++) { 35 | scanf("%d:", &k); 36 | for(int j = 0; j < k; j++) { 37 | scanf("%d", &t); 38 | if(course[t] == 0) 39 | course[t] = i; 40 | Union(i, findFather(course[t])); 41 | } 42 | } 43 | for(int i = 1; i <= n; i++) 44 | isRoot[findFather(i)]++; 45 | for(int i = 1; i <= n; i++) { 46 | if(isRoot[i] != 0) 47 | cnt++; 48 | } 49 | printf("%d\n", cnt); 50 | sort(isRoot.begin(), isRoot.end(), cmp1); 51 | for(int i = 0; i < cnt; i++) { 52 | printf("%d", isRoot[i]); 53 | if(i != cnt - 1) printf(" "); 54 | } 55 | return 0; 56 | } 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /L3-004 肿瘤诊断.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | struct node { 5 | int x, y, z; 6 | }; 7 | int m, n, l, t; 8 | int X[6] = {1, 0, 0, -1, 0, 0}; 9 | int Y[6] = {0, 1, 0, 0, -1, 0}; 10 | int Z[6] = {0, 0, 1, 0, 0, -1}; 11 | int arr[1300][130][80]; 12 | bool visit[1300][130][80]; 13 | bool judge(int x, int y, int z) { 14 | if(x < 0 || x >= m || y < 0 || y >= n || z < 0 || z >= l) return false; 15 | if(arr[x][y][z] == 0 || visit[x][y][z] == true) return false; 16 | return true; 17 | } 18 | int bfs(int x, int y, int z) { 19 | int cnt = 0; 20 | node temp; 21 | temp.x = x, temp.y = y, temp.z = z; 22 | queue q; 23 | q.push(temp); 24 | visit[x][y][z] = true; 25 | while(!q.empty()) { 26 | node top = q.front(); 27 | q.pop(); 28 | cnt++; 29 | for(int i = 0; i < 6; i++) { 30 | int tx = top.x + X[i]; 31 | int ty = top.y + Y[i]; 32 | int tz = top.z + Z[i]; 33 | if(judge(tx, ty, tz)) { 34 | visit[tx][ty][tz] = true; 35 | temp.x = tx, temp.y = ty, temp.z = tz; 36 | q.push(temp); 37 | } 38 | } 39 | } 40 | if(cnt >= t) 41 | return cnt; 42 | else 43 | return 0; 44 | 45 | } 46 | int main() { 47 | scanf("%d %d %d %d", &m, &n, &l, &t); 48 | for(int i = 0; i < l; i++) 49 | for(int j = 0; j < m; j++) 50 | for(int k = 0; k < n; k++) 51 | scanf("%d", &arr[j][k][i]); 52 | int ans = 0; 53 | for(int i = 0; i < l; i++) { 54 | for(int j = 0; j < m; j++) { 55 | for(int k = 0; k < n; k++) { 56 | if(arr[j][k][i] == 1 && visit[j][k][i] == false) 57 | ans += bfs(j, k, i); 58 | } 59 | } 60 | } 61 | printf("%d", ans); 62 | return 0; 63 | } -------------------------------------------------------------------------------- /L3-005 垃圾箱分布.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | using namespace std; 6 | const int inf = 999999999; 7 | int n, m, k, ds, station; 8 | int e[1020][1020], dis[1020]; 9 | bool visit[1020]; 10 | int main() { 11 | fill(e[0], e[0] + 1020 * 1020, inf); 12 | fill(dis, dis + 1020, inf); 13 | scanf("%d%d%d%d", &n, &m, &k, &ds); 14 | for(int i = 0; i < k; i++) { 15 | int tempdis; 16 | string s, t; 17 | cin >> s >> t >> tempdis; 18 | int a, b; 19 | if(s[0] == 'G') { 20 | s = s.substr(1); 21 | a = n + stoi(s); 22 | } else { 23 | a = stoi(s); 24 | } 25 | if(t[0] == 'G') { 26 | t = t.substr(1); 27 | b = n + stoi(t); 28 | } else { 29 | b = stoi(t); 30 | } 31 | e[a][b] = tempdis; 32 | e[b][a] = tempdis; 33 | } 34 | int ansid = -1; 35 | double ansdis = -1, ansaver = inf; 36 | for(int index = n + 1; index <= n + m; index++) { 37 | double mindis = inf, aver = 0; 38 | fill(dis, dis + 1020, inf); 39 | fill(visit, visit + 1020, false); 40 | dis[index] = 0; 41 | for(int i = 0; i < n + m; i++) { 42 | int u = -1, minn = inf; 43 | for(int j = 1; j <= n + m; j++) { 44 | if(visit[j] == false && dis[j] < minn) { 45 | u = j; 46 | minn = dis[j]; 47 | } 48 | } 49 | if(u == -1) break; 50 | visit[u] = true; 51 | for(int v = 1; v <= n + m; v++) { 52 | if(visit[v] == false && dis[v] > dis[u] + e[u][v]) 53 | dis[v] = dis[u] + e[u][v]; 54 | } 55 | } 56 | for(int i = 1; i <= n; i++) { 57 | if(dis[i] > ds) { 58 | mindis = -1; 59 | break; 60 | } 61 | if(dis[i] < mindis) mindis = dis[i]; 62 | aver += 1.0 * dis[i]; 63 | } 64 | if(mindis == -1) continue; 65 | aver = aver / n; 66 | if(mindis > ansdis) { 67 | ansid = index; 68 | ansdis = mindis; 69 | ansaver = aver; 70 | } else if(mindis == ansdis && aver < ansaver) { 71 | ansid = index; 72 | ansaver = aver; 73 | } 74 | } 75 | if(ansid == -1) 76 | printf("No Solution"); 77 | else { 78 | printf("G%d\n", ansid - n); 79 | printf("%.1f %.1f", ansdis, ansaver); 80 | } 81 | return 0; 82 | } -------------------------------------------------------------------------------- /L3-006 迎风一刀斩.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int n, k1, k2, SLength, LLength, SWidth, LWidth, res, dif, D1, D2, a, b; 4 | vector> A(10), B(10); 5 | void deal(const vector> &C, const int &l) { 6 | res = SLength = LLength = SWidth = LWidth = 0; 7 | for (int i = 0; i < l; i++) { 8 | if (C[i].first == C[(i + 1) % l].first) { 9 | res++; 10 | dif = abs(C[i].second - C[(i + 1) % l].second); 11 | if (dif > LLength) SLength = LLength, LLength = dif; 12 | else SLength = dif; 13 | } else if (C[i].second == C[(i + 1) % l].second) { 14 | res++; 15 | dif = abs(C[i].first - C[(i + 1) % l].first); 16 | if (dif > LWidth) SWidth = LWidth, LWidth = dif; 17 | else SWidth = dif; 18 | } 19 | } 20 | } 21 | string judge() { 22 | if (k1 > 5 || k2 > 5) return "NO"; 23 | if (k1 == 4 && k2 == 4) { 24 | deal(A, k1); 25 | if (res == 4) { 26 | D1 = LLength, D2 = LWidth; 27 | deal(B, k2); 28 | if (res != 4) return "NO"; 29 | if (D1 == LLength || D2 == LWidth || D2 == LLength || D1 == LWidth) return "YES"; 30 | } else if (res == 3) { 31 | if (SWidth == 0) D1 = LWidth, D2 = LLength - SLength; 32 | else D1 = LLength, D2 = LWidth - SWidth; 33 | deal(B, k2); 34 | if (res != 3) return "NO"; 35 | if (SWidth == 0 && D1 == LWidth && D2 == LLength - SLength) return "YES"; 36 | else if (SLength == 0 && D1 == LLength && D2 == LWidth - SWidth) return "YES"; 37 | 38 | } 39 | return "NO"; 40 | } 41 | if (k2 > k1) swap(k1, k2), swap(A, B); 42 | deal(A, k1); 43 | if (res != k1 - 1) return "NO"; 44 | D1 = LLength - SLength, D2 = LWidth - SWidth; 45 | deal(B, k2); 46 | if (res != k2 - 1) return "NO"; 47 | if ((D1 == LLength && D2 == LWidth) || (D2 == LLength && D1 == LWidth)) return "YES"; 48 | return "NO"; 49 | } 50 | int main() { 51 | cin >> n; 52 | while (n--) { 53 | cin >> k1; 54 | for (int i = 0; i < k1; i++) cin >> A[i].first >> A[i].second; 55 | cin >> k2; 56 | for (int i = 0; i < k2; i++) cin >> B[i].first >> B[i].second; 57 | cout << judge() << '\n'; 58 | } 59 | return 0; 60 | } -------------------------------------------------------------------------------- /L3-007 天梯地图 .cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | const int inf = 999999999; 6 | int dis[510], Time[510], e[510][510], w[510][510], Timepre[510], weight[510]; 7 | bool visit[510]; 8 | vector Timepath, dispath, temppath, dispre[510]; 9 | int st, fin, minnode = inf; 10 | void dfsTimepath(int v) { 11 | Timepath.push_back(v); 12 | if(v == st) { 13 | return ; 14 | } 15 | dfsTimepath(Timepre[v]); 16 | } 17 | void dfsdispath(int v) { 18 | temppath.push_back(v); 19 | if(v == st) { 20 | if(temppath.size() < minnode) { 21 | minnode = temppath.size(); 22 | dispath = temppath; 23 | } 24 | temppath.pop_back(); 25 | return ; 26 | } 27 | for(int i = 0; i < dispre[v].size(); i++) { 28 | dfsdispath(dispre[v][i]); 29 | } 30 | temppath.pop_back(); 31 | } 32 | int main() { 33 | fill(dis, dis + 510, inf); 34 | fill(Time, Time + 510, inf); 35 | fill(weight, weight + 510, inf); 36 | fill(e[0], e[0] + 510 * 510, inf); 37 | fill(w[0], w[0] + 510 * 510, inf); 38 | int n, m; 39 | scanf("%d %d", &n, &m); 40 | int a, b, flag, len, t; 41 | for(int i = 0; i < m; i++) { 42 | scanf("%d %d %d %d %d", &a, &b, &flag, &len, &t); 43 | e[a][b] = len; 44 | w[a][b] = t; 45 | if(flag != 1) { 46 | e[b][a] = len; 47 | w[b][a] = t; 48 | } 49 | } 50 | scanf("%d %d", &st, &fin); 51 | Time[st] = 0; 52 | for(int i = 0; i < n; i++) { 53 | Timepre[i] = i; 54 | } 55 | for(int i = 0; i < n; i++) { 56 | int u = -1, minn = inf; 57 | for(int j = 0; j < n; j++) { 58 | if(visit[j] == false && Time[j] < minn) { 59 | u = j; 60 | minn = Time[j]; 61 | } 62 | } 63 | if(u == -1) break; 64 | visit[u] = true; 65 | for(int v = 0; v < n; v++) { 66 | if(visit[v] == false && w[u][v] != inf) { 67 | if(w[u][v] + Time[u] < Time[v]) { 68 | Time[v] = w[u][v] + Time[u]; 69 | Timepre[v] = u; 70 | weight[v] = weight[u] + e[u][v]; 71 | } else if(w[u][v] + Time[u] == Time[v] && weight[v] > weight[u] + e[u][v]) { 72 | weight[v] = weight[u] + e[u][v]; 73 | Timepre[v] = u; 74 | } 75 | } 76 | } 77 | } 78 | dfsTimepath(fin); 79 | fill(visit, visit + 510, false); 80 | dis[st] = 0; 81 | for(int i = 0; i < n; i++) { 82 | int u = -1, minn = inf; 83 | for(int j = 0; j < n; j++) { 84 | if(visit[j] == false && minn > dis[j]) { 85 | u = j; 86 | minn = dis[j]; 87 | } 88 | } 89 | if(u == -1) break; 90 | visit[u] = true; 91 | for(int v = 0; v < n; v++) { 92 | if(visit[v] == false && e[u][v] != inf) { 93 | if(e[u][v] + dis[u] < dis[v]) { 94 | dis[v] = e[u][v] + dis[u]; 95 | dispre[v].clear(); 96 | dispre[v].push_back(u); 97 | } else if(e[u][v] + dis[u] == dis[v]) { 98 | dispre[v].push_back(u); 99 | } 100 | } 101 | } 102 | } 103 | dfsdispath(fin); 104 | printf("Time = %d", Time[fin]); 105 | if(dispath == Timepath) { 106 | printf("; Distance = %d: ", dis[fin]); 107 | } else { 108 | printf(": "); 109 | for(int i = Timepath.size() - 1; i >= 0; i--) { 110 | printf("%d", Timepath[i]); 111 | if(i != 0) printf(" => "); 112 | } 113 | printf("\n"); 114 | printf("Distance = %d: ", dis[fin]); 115 | } 116 | for(int i = dispath.size() - 1; i >= 0; i--) { 117 | printf("%d", dispath[i]); 118 | if(i != 0) printf(" => "); 119 | } 120 | return 0; 121 | } -------------------------------------------------------------------------------- /L3-008 喊山 .cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | using namespace std; 6 | vector> v(10010); 7 | int book[10010]; 8 | int main() { 9 | int n, m, k, a, b; 10 | scanf("%d%d%d", &n, &m, &k); 11 | for(int i = 0; i < m; i++) { 12 | scanf("%d%d", &a, &b); 13 | v[a].push_back(b); 14 | v[b].push_back(a); 15 | } 16 | for(int i = 0; i < k; i++) { 17 | scanf("%d", &a); 18 | queue q; 19 | fill(book, book + 10010, 0); 20 | q.push(a); 21 | int level[10010]; 22 | int ans = 10010, maxlevel = 0; 23 | book[a] = 1; 24 | while(!q.empty()) { 25 | int top = q.front(); 26 | q.pop(); 27 | if(level[top] > maxlevel) { 28 | maxlevel = level[top]; 29 | ans = 10010; 30 | } 31 | if(top != a) 32 | ans = min(ans, top); 33 | for(int j = 0; j < v[top].size(); j++) { 34 | if(book[v[top][j]] == 0) { 35 | q.push(v[top][j]); 36 | book[v[top][j]] = 1; 37 | level[v[top][j]] = level[top] + 1; 38 | } 39 | } 40 | } 41 | if(ans != 10010) printf("%d\n", ans); 42 | else printf("0\n"); 43 | } 44 | return 0; 45 | } -------------------------------------------------------------------------------- /L3-009 长城.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | long long n, top, ans, X[100005], Y[100005], tower[100005], vis[100005]; 4 | bool isConcave (const int &l, const int &mid, const int &r) { 5 | return (Y[r] - Y[l]) * (X[mid] - X[l]) >= (Y[mid] - Y[l]) * (X[r] - X[l]); 6 | } 7 | int main() { 8 | cin >> n; 9 | for (int i = 0; i < n; i++) { 10 | cin >> X[i] >> Y[i]; 11 | if (top) { 12 | while (top > 1 && isConcave(i, tower[top], tower[top - 1])) top--; 13 | if (top != 1 && !vis[tower[top]]) vis[tower[top]] = 1, ans++; 14 | } 15 | tower[++top] = i; 16 | } 17 | cout << ans; 18 | return 0; 19 | } -------------------------------------------------------------------------------- /L3-010 是否完全二叉搜索树.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int tree[1<<20]; 4 | int num; 5 | void BST(int a) { 6 | if(tree[a] == 0) 7 | tree[a] = num; 8 | else if(tree[a] < num) 9 | BST(a<<1); 10 | else 11 | BST(a<<1|1); 12 | } 13 | int main() { 14 | int n; 15 | scanf("%d", &n); 16 | for(int i = 0; i < n; i++) { 17 | scanf("%d", &num); 18 | BST(1); 19 | } 20 | bool flag = true; 21 | for(int cnt = 1, k = 1; cnt <= n; k++) { 22 | if(tree[k] == 0) 23 | flag = false; 24 | else { 25 | printf("%d", tree[k]); 26 | if(cnt++ != n) printf(" "); 27 | } 28 | } 29 | if(flag) printf("\nYES"); 30 | else printf("\nNO"); 31 | return 0; 32 | } -------------------------------------------------------------------------------- /L3-011 直捣黄龙.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | struct node { 4 | int id, dis; 5 | bool friend operator < (const node &a, const node &b) { 6 | return a.dis > b.dis; 7 | } 8 | }; 9 | int n, k, s, t, cnt, d, num[205], Num[205], path[205], Dis[205], vis[205], sum[205], liberation[205]; 10 | map ntoi; 11 | map iton; 12 | vector> E[205]; 13 | vector ans; 14 | string S, T, u, v; 15 | void Dijskra() { 16 | fill(Dis, Dis + 205, 1e9); 17 | Dis[s] = 0; 18 | sum[s] = 1; 19 | priority_queue Q; 20 | Q.push(node{s, 0}); 21 | while (!Q.empty()) { 22 | int Now = Q.top().id, D = Q.top().dis; 23 | Q.pop(); 24 | if (vis[Now]) continue; 25 | vis[Now] = 1; 26 | for (auto it : E[Now]) { 27 | int V = it.first, DIS = it.second; 28 | if (Dis[V] > D + DIS) { 29 | Num[V] = Num[Now] + num[V]; 30 | sum[V] = sum[Now]; 31 | liberation[V] = liberation[Now] + 1; 32 | Dis[V] = D + DIS; 33 | Q.push(node{V, Dis[V]}); 34 | path[V] = Now; 35 | } else if (Dis[V] == D + DIS) { 36 | sum[V] += sum[Now]; 37 | if (liberation[V] < liberation[Now] + 1) { 38 | liberation[V] = liberation[Now] + 1; 39 | Num[V] = Num[Now] + num[V]; 40 | Q.push(node{V, Dis[V]}); 41 | path[V] = Now; 42 | } else if (liberation[V] == liberation[Now] + 1) { 43 | if (Num[V] < Num[Now] + num[V]) { 44 | Num[V] = Num[Now] + num[V]; 45 | Q.push(node{V, Dis[V]}); 46 | path[V] = Now; 47 | } 48 | } 49 | 50 | } 51 | } 52 | } 53 | } 54 | int main() { 55 | cin >> n >> k >> S >> T; 56 | for (int i = 0; i < n - 1; i++) { 57 | cin >> u >> d; 58 | ntoi[u] = ++cnt; 59 | iton[cnt] = u; 60 | num[cnt] = d; 61 | } 62 | ntoi[S] = 0, iton[0] = S, t = ntoi[T]; 63 | for (int i = 0; i < k; i++) { 64 | cin >> u >> v >> d; 65 | E[ntoi[u]].push_back({ntoi[v], d}); 66 | E[ntoi[v]].push_back({ntoi[u], d}); 67 | } 68 | Dijskra(); 69 | d = t; 70 | while(d) { 71 | ans.push_back(d); 72 | d = path[d]; 73 | } 74 | cout << iton[0]; 75 | for (int i = ans.size() - 1; i >= 0; i--) cout << "->" << iton[ans[i]]; 76 | cout << '\n' << sum[t] << ' ' << Dis[t] << ' ' << Num[t] << '\n'; 77 | return 0; 78 | } -------------------------------------------------------------------------------- /L3-012 水果忍者.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | struct node { 4 | double x, y1, y2; 5 | bool friend operator < (const node &a, const node &b) { 6 | return a.x < b.x; 7 | } 8 | }Fruit[10000]; 9 | int n, hx, hy; 10 | double kmax, kmin, tkmax, tkmin; 11 | int main() { 12 | cin >> n; 13 | for (int i = 0; i < n; i++) cin >> Fruit[i].x >> Fruit[i].y1 >> Fruit[i].y2; 14 | sort(Fruit, Fruit + n); 15 | for (int i = 0, j; i < n; i++) { 16 | kmax = 1e9, kmin = -1e9; 17 | for (j = 0; j < n; j++) { 18 | if (i == j) continue; 19 | if (i < j) { 20 | tkmax = (Fruit[j].y1 - Fruit[i].y2) / (Fruit[j].x - Fruit[i].x); 21 | tkmin = (Fruit[j].y2 - Fruit[i].y2) / (Fruit[j].x - Fruit[i].x); 22 | } else { 23 | tkmax = (Fruit[i].y2 - Fruit[j].y2) / (Fruit[i].x - Fruit[j].x); 24 | tkmin = (Fruit[i].y2 - Fruit[j].y1) / (Fruit[i].x - Fruit[j].x); 25 | } 26 | if (tkmax < kmin || tkmin > kmax) break; 27 | if (tkmax < kmax) { 28 | kmax = tkmax; 29 | hx = Fruit[j].x; 30 | hy = Fruit[j].y1; 31 | } 32 | kmin = max(kmin, tkmin); 33 | } 34 | if (j == n) { 35 | cout << hx << ' ' << hy << ' ' << (int)Fruit[i].x << ' ' << (int)Fruit[i].y2; 36 | break; 37 | } 38 | } 39 | return 0; 40 | } -------------------------------------------------------------------------------- /L3-013 非常弹的球.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main() { 3 | double w, p, v2, s = 0; 4 | scanf("%lf%lf", &w, &p); 5 | v2 = 2 * 1000 * 100 / w; 6 | while (v2 > 0.000001) { 7 | s += v2 / 9.8; 8 | v2 *= (100 - p) * 0.01; 9 | } 10 | printf("%.3f", s); 11 | return 0; 12 | } 13 | -------------------------------------------------------------------------------- /L3-014 周游世界.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | vector> v(10000); 5 | int line[10000][10000], visit[10000]; 6 | vector path, tempPath; 7 | int transferCnt(vector a) { 8 | int cnt = -1, preLine = 0; 9 | for (int i = 1; i < a.size(); i++) { 10 | if (line[a[i-1]][a[i]] != preLine) cnt++; 11 | preLine = line[a[i-1]][a[i]]; 12 | } 13 | return cnt; 14 | } 15 | void dfs(int node, int end, int cnt, int &minCnt, int &minTransfer) { 16 | if (node == end && (cnt < minCnt || (cnt == minCnt && transferCnt(tempPath) < minTransfer))) { 17 | minCnt = cnt; 18 | minTransfer = transferCnt(tempPath); 19 | path = tempPath; 20 | } 21 | if (node == end) return; 22 | for (int i = 0; i < v[node].size(); i++) { 23 | if (visit[v[node][i]] == 0) { 24 | visit[v[node][i]] = 1; 25 | tempPath.push_back(v[node][i]); 26 | dfs(v[node][i], end, cnt + 1, minCnt, minTransfer); 27 | visit[v[node][i]] = 0; 28 | tempPath.pop_back(); 29 | } 30 | } 31 | } 32 | int main() { 33 | int n, m, k, pre, temp, a, b; 34 | scanf("%d", &n); 35 | for (int i = 0; i < n; i++) { 36 | scanf("%d%d", &m, &pre); 37 | for (int j = 1; j < m; j++) { 38 | scanf("%d", &temp); 39 | v[pre].push_back(temp); 40 | v[temp].push_back(pre); 41 | line[pre][temp] = line[temp][pre] = i + 1; 42 | pre = temp; 43 | } 44 | } 45 | scanf("%d", &k); 46 | for (int i = 0; i < k; i++) { 47 | scanf("%d%d", &a, &b); 48 | int minCnt = 99999, minTransfer = 99999; 49 | tempPath.clear(); 50 | tempPath.push_back(a); 51 | visit[a] = 1; 52 | dfs(a, b, 0, minCnt, minTransfer); 53 | visit[a] = 0; 54 | if (minCnt == 99999) { 55 | printf("Sorry, no line is available.\n"); 56 | continue; 57 | } 58 | printf("%d\n", minCnt); 59 | int preLine = 0, preTransfer = a; 60 | for (int j = 1; j < path.size(); j++) { 61 | if (line[path[j-1]][path[j]] != preLine) { 62 | if (preLine != 0) printf("Go by the line of company #%d from %04d to %04d.\n", preLine, preTransfer, path[j-1]); 63 | preLine = line[path[j-1]][path[j]]; 64 | preTransfer = path[j-1]; 65 | } 66 | } 67 | printf("Go by the line of company #%d from %04d to %04d.\n", preLine, preTransfer, b); 68 | } 69 | return 0; 70 | } -------------------------------------------------------------------------------- /L3-015 球队“食物链”.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int n, flag = 0; 4 | int result[21]; 5 | bool v[21][21], visit[21]; 6 | void dfs(int index, int num) { 7 | if (flag == 1) return; 8 | result[index] = num; 9 | if (index == n && v[num][1] == true) { 10 | flag = 1; 11 | return; 12 | } 13 | if (index == n) return; 14 | bool cut = false; 15 | for (int i = 1; i <= n; i++) { 16 | if (visit[i] == false && v[i][1] == true) 17 | cut = true; 18 | } 19 | if (cut == false) return; 20 | visit[num] = true; 21 | for (int i = 1; i <= n; i++) { 22 | if (visit[i] == false && v[num][i] == true) 23 | dfs(index + 1, i); 24 | } 25 | visit[num] = false; 26 | } 27 | int main() { 28 | scanf("%d", &n); 29 | char s[21]; 30 | for (int i = 1; i <= n; i++) { 31 | scanf("%s", s + 1); 32 | for (int j = 1; j <= n; j++) { 33 | if (s[j] == 'W') v[i][j] = true; 34 | if (s[j] == 'L') v[j][i] = true; 35 | } 36 | } 37 | dfs(1, 1); 38 | if (flag == 1) { 39 | for (int i = 1; i <= n; i++) 40 | printf("%s%d", i == 1 ? "" : " ", result[i]); 41 | } else { 42 | printf("No Solution"); 43 | } 44 | return 0; 45 | } -------------------------------------------------------------------------------- /L3-016 二叉搜索树的结构.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | struct node { 4 | int num, lchild, rchild, parent, level; 5 | node() { 6 | lchild = rchild = parent = -1; 7 | } 8 | }Tree[128]; 9 | int n, m, a, b, in, cnt, root = 1, f; 10 | map Find; 11 | string t; 12 | void insert(int x) { 13 | int now = root; 14 | while(Tree[now].num != x) { 15 | if (x < Tree[now].num) { 16 | if (Tree[now].lchild == -1) { 17 | Tree[cnt].num = x; 18 | Tree[cnt].level = Tree[now].level + 1; 19 | Tree[cnt].parent = now; 20 | Tree[now].lchild = cnt; 21 | } 22 | now = Tree[now].lchild; 23 | } else { 24 | if (Tree[now].rchild == -1) { 25 | Tree[cnt].num = x; 26 | Tree[cnt].level = Tree[now].level + 1; 27 | Tree[cnt].parent = now; 28 | Tree[now].rchild = cnt; 29 | } 30 | now = Tree[now].rchild; 31 | } 32 | } 33 | } 34 | int main() { 35 | cin >> n >> in; 36 | Tree[++cnt].num = in; 37 | Find[in] = cnt; 38 | for (int i = 1; i < n; i++) { 39 | cin >> in; 40 | Find[in] = ++cnt; 41 | insert(in); 42 | } 43 | cin >> m; 44 | while (m--) { 45 | f = 0; 46 | cin >> a >> t; 47 | if (t == "is") { 48 | cin >> t >> t; 49 | if (t == "root") { 50 | if (Find[a] == root) f = 1; 51 | } else if (t == "parent") { 52 | cin >> t >> b; 53 | if (Tree[Find[b]].parent == Find[a]) f = 1; 54 | } else if (t == "left") { 55 | cin >> t >> t >> b; 56 | if (Tree[Find[b]].lchild == Find[a]) f = 1; 57 | } else { 58 | cin >> t >> t >> b; 59 | if (Tree[Find[b]].rchild == Find[a]) f = 1; 60 | } 61 | } else { 62 | cin >> b >> t >> t; 63 | if (t == "siblings") { 64 | if (Find[a] && Find[b] && Tree[Find[a]].parent == Tree[Find[b]].parent) f = 1; 65 | } else { 66 | cin >> t >> t >> t; 67 | if (Find[a] && Find[b] && Tree[Find[a]].level == Tree[Find[b]].level) f = 1; 68 | } 69 | } 70 | cout << (f ? "Yes" : "No") << '\n'; 71 | } 72 | return 0; 73 | } -------------------------------------------------------------------------------- /L3-017 森森快递.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #define Lx(a) (a << 1) + 1 3 | #define Rx(a) (a << 1) + 2 4 | using namespace std; 5 | int n, m, Size; 6 | long long ans, temp; 7 | pair B[100000]; 8 | struct segtree { 9 | vector values, mins; 10 | void init(int n) { 11 | Size = 1; 12 | while (Size < n) Size *= 2; 13 | values.assign(2 * Size, 0LL); 14 | mins.assign(2 * Size, 0LL); 15 | build(0, 0, Size, n); 16 | } 17 | void build(int x, int lx, int rx, int R) { 18 | if (rx - lx == 1) { 19 | if (lx < R) { 20 | cin >> mins[x]; 21 | values[x] = mins[x]; 22 | } 23 | return; 24 | } 25 | int mid = lx + rx >> 1; 26 | build(Lx(x), lx, mid, R); 27 | build(Rx(x), mid, rx, R); 28 | mins[x] = min(mins[Lx(x)], mins[Rx(x)]) + values[x]; 29 | } 30 | void modify(int l, int r, int v, int x, int lx, int rx) { 31 | if (lx >= r || rx <= l) return; 32 | if (lx >= l && rx <= r) { 33 | mins[x] += v; 34 | values[x] += v; 35 | return; 36 | } 37 | int mid = lx + rx >> 1; 38 | modify(l, r, v, Lx(x), lx, mid); 39 | modify(l, r, v, Rx(x), mid, rx); 40 | mins[x] = min(mins[Lx(x)], mins[Rx(x)]) + values[x]; 41 | return; 42 | } 43 | long long get_min(int l, int r, int x, int lx, int rx) { 44 | if (lx >= r || rx <= l) return LLONG_MAX; 45 | if (lx >= l && rx <= r) return mins[x]; 46 | int mid = lx + rx >> 1; 47 | long long s1 = get_min(l, r, Lx(x), lx, mid); 48 | long long s2 = get_min(l, r, Rx(x), mid, rx); 49 | return min(s1, s2) + values[x]; 50 | } 51 | }st; 52 | bool cmp (const pair &a, const pair &b) { 53 | if (a.second != b.second) return a.second < b.second; 54 | return a.first < b.first; 55 | } 56 | int main() { 57 | cin >> n >> m; 58 | st.init(--n); 59 | for (int i = 0; i < m; i++) { 60 | cin >> B[i].first >> B[i].second; 61 | if (B[i].first > B[i].second) swap(B[i].first, B[i].second); 62 | } 63 | sort(B, B + m, cmp); 64 | for (int i = 0; i < m; i++) { 65 | temp = st.get_min(B[i].first, B[i].second, 0, 0, Size); 66 | ans += temp; 67 | st.modify(B[i].first, B[i].second, -temp, 0, 0, Size); 68 | } 69 | cout << ans; 70 | return 0; 71 | } -------------------------------------------------------------------------------- /L3-019 代码排版.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int point, space = 2, mark, tp, cnt, use, temp; 4 | string s; 5 | int Function(int c) { 6 | if (c == 0) while (s[point] == ' ') point++; 7 | else if (c == 1) for (int i = 0; i < space; i++) cout << ' '; 8 | else if (c == 2) { 9 | if (s.substr(point, 2) == "if" && (s[point + 2] == '(' || s[point + 2] == ' ')) return 2; 10 | else if (s.substr(point, 3) == "for" && (s[point + 3] == '(' || s[point + 3] == ' ')) return 3; 11 | else if (s.substr(point, 4) == "else" && (s[point + 4] == '(' || s[point + 4] == ' ')) return 4; 12 | else if (s.substr(point, 5) == "while" && (s[point + 5] == '(' || s[point + 5] == ' ')) return 5; 13 | } else if (c == 3) { 14 | Function(0); 15 | if (Function(2) == 4) return 0; 16 | while (mark) { 17 | space -= 2; 18 | Function(1); 19 | cout << "}\n"; 20 | mark--; 21 | } 22 | } 23 | return 0; 24 | } 25 | int main() { 26 | getline(cin, s); 27 | Function(0); 28 | for (int i = point; s[i] != ')'; i++) cout << s[i]; 29 | cout << ")\n{\n"; 30 | point = s.find('{') + 1; 31 | while (1) { 32 | Function(0); 33 | temp = Function(2); 34 | if (s[point] == '{') { 35 | Function(1); 36 | cout << "{\n"; 37 | space += 2; 38 | point++; 39 | } else if (s[point] == '}') { 40 | space -= 2; 41 | Function(1); 42 | cout << "}\n"; 43 | if (space == 0) return 0; 44 | Function(3); 45 | point++; 46 | } else if (temp) { 47 | Function(1); 48 | cout << s.substr(point, temp); 49 | point += temp; 50 | if (temp != 4) { 51 | Function(0); 52 | tp = point; 53 | cnt = 0; 54 | while(tp < s.size()) { 55 | if (s[tp] == '(') cnt++; 56 | else if (s[tp] == ')') cnt--; 57 | tp++; 58 | if (cnt == 0) break; 59 | } 60 | cout << ' ' << s.substr(point, tp - point); 61 | point = tp; 62 | } 63 | cout << " {\n"; 64 | space += 2; 65 | Function(0); 66 | if (s[point] != '{') { 67 | use = 1; 68 | mark++; 69 | } else { 70 | use = 0; 71 | point++; 72 | } 73 | } else { 74 | Function(1); 75 | cnt = s.find(';', point); 76 | cout << s.substr(point, cnt - point + 1) << '\n'; 77 | point = cnt + 1; 78 | if (use && mark) { 79 | space -= 2; 80 | Function(1); 81 | cout << "}\n"; 82 | mark--; 83 | Function(3); 84 | } 85 | } 86 | } 87 | return 0; 88 | } -------------------------------------------------------------------------------- /L3-020 至多删三个字符.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | string s; 4 | long long dp[1000001][4], vis[128], last; 5 | int main() { 6 | cin >> s; 7 | for (int i = 0; i <= s.size(); i++) dp[i][0] = 1; 8 | for (int i = 1; i <= s.size(); i++) { 9 | last = vis[s[i - 1]]; 10 | vis[s[i - 1]] = i; 11 | for (int j = 1; j <= 3; j++) { 12 | dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1]; 13 | if (last && j - (i - last) >= 0) dp[i][j] -= dp[last - 1][j - (i - last)]; 14 | } 15 | } 16 | cout << dp[s.size()][0] + dp[s.size()][1] + dp[s.size()][2] + dp[s.size()][3]; 17 | return 0; 18 | } -------------------------------------------------------------------------------- /L3-021 神坛.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int n, i, cnt; 4 | long long ans = 1e17; 5 | bool cmp (const pair &a, const pair &b) { 6 | if (a.first * b.second != b.first * a.second) 7 | return a.first * b.second > b.first * a.second; 8 | return a.first < b.first; 9 | } 10 | int main() { 11 | scanf("%d", &n); 12 | vector> A(n), B(n - 1); 13 | for (i = 0; i < n; i++) scanf("%lld %lld", &A[i].first, &A[i].second); 14 | for (i = 0; i < n; i++, cnt = 0) { 15 | for (int j = 0; j < n; j++) { 16 | if (i == j) continue; 17 | B[cnt++] = {A[j].first - A[i].first, A[j].second - A[i].second}; 18 | } 19 | sort(B.begin(), B.end(), cmp); 20 | for (int j = 1; j < n - 1; ++j) ans = min(ans, abs(B[j - 1].first * B[j].second - B[j].first * B[j - 1].second)); 21 | } 22 | printf("%.3f", 0.5 * ans); 23 | return 0; 24 | } -------------------------------------------------------------------------------- /L3-022 地铁一日游.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | const int Mx = 1e9; 4 | int N, M, K, Q, from, to, dis, Ter[201], Edge[201][201]; 5 | map> Station; 6 | map> Ans; 7 | void DFS(int Start, int Now) { 8 | for (auto it : Station[Now]) { 9 | if (Ans[Start].count(it)) continue; 10 | Ans[Start].insert(it); 11 | DFS(Start, it); 12 | } 13 | } 14 | int main() { 15 | for (int i = 1; i <= 200; i++) 16 | for (int j = 1; j <= 200; j++) 17 | Edge[i][j] = Mx; 18 | scanf("%d %d %d", &N, &M, &K); 19 | while (M--) { 20 | scanf("%d", &from); 21 | Ter[from] = 1; 22 | while (1) { 23 | scanf("%d %d", &dis, &to); 24 | Edge[from][to] = Edge[to][from] = min(Edge[from][to], dis); 25 | from = to; 26 | if (getchar() == '\n') break; 27 | } 28 | Ter[to] = 1; 29 | } 30 | for (int k = 1; k <= N; k++) 31 | for (int i = 1; i <= N; i++) 32 | for (int j = 1; j <= N; j++) 33 | if (i != j) Edge[i][j] = min(Edge[i][j], Edge[i][k] + Edge[k][j]); 34 | for (int i = 1; i <= N; i++) { 35 | map Fur_Dis; 36 | Ans[i].insert(i); 37 | for (int j = 1; j <= N; j++) { 38 | if (Edge[i][j] != Mx) { 39 | if (Ter[j] == 1) Station[i].insert(j); 40 | if (Edge[i][j] > Fur_Dis[Edge[i][j] / K]) Fur_Dis[Edge[i][j] / K] = Edge[i][j]; 41 | } 42 | } 43 | for (int j = 1; j <= N; j++) 44 | if (Edge[i][j] == Fur_Dis[Edge[i][j] / K]) Station[i].insert(j); 45 | } 46 | for (int i = 1; i <= N; i++) DFS(i, i); 47 | scanf("%d", &Q); 48 | while (Q--) { 49 | scanf("%d", &from); 50 | for (auto it : Ans[from]) 51 | printf("%d%c", it, (it != *Ans[from].rbegin()) ? ' ' : '\n'); 52 | } 53 | return 0; 54 | } -------------------------------------------------------------------------------- /L3-023 计算图.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | struct node { 4 | int which, op1, op2; 5 | double value; 6 | }A[50001]; 7 | int N, start = -1, cnt, de[50001]; 8 | map>> Record; 9 | double deal(int c, int index, int to) { 10 | if (Record[c][index][to]) return Record[c][index][to]; 11 | if (A[index].which == 0) return Record[c][index][to] = c ? (index == to ? 1.0 : 0.0) : A[index].value; 12 | else if (A[index].which == 1) return Record[c][index][to] = deal(c, A[index].op1, to) + deal(c, A[index].op2, to); 13 | else if (A[index].which == 2) return Record[c][index][to] = deal(c, A[index].op1, to) - deal(c, A[index].op2, to); 14 | else if (A[index].which == 3) return Record[c][index][to] = c ? (deal(1, A[index].op1, to) * deal(0, A[index].op2, to) + deal(0, A[index].op1, to) * deal(1, A[index].op2, to)) : (deal(0, A[index].op1, to) * deal(0, A[index].op2, to)); 15 | else if (A[index].which == 4) return Record[c][index][to] = c ? exp(deal(0, A[index].op1, to)) * deal(1, A[index].op1, to) : exp(deal(0, A[index].op1, to)); 16 | else if (A[index].which == 5) return Record[c][index][to] = c ? 1.0 / deal(0, A[index].op1, to) * deal(1, A[index].op1, to) : log(deal(0, A[index].op1, to)); 17 | else return Record[c][index][to] = c ? cos(deal(0, A[index].op1, to)) * deal(1, A[index].op1, to) : sin(deal(0, A[index].op1, to)); 18 | } 19 | int main() { 20 | scanf("%d", &N); 21 | for (int i = 0; i < N; i++) { 22 | scanf("%d", &A[i].which); 23 | if (A[i].which == 0) { 24 | ++cnt; 25 | scanf("%lf", &A[i].value); 26 | } else if (A[i].which < 4) { 27 | scanf("%d%d", &A[i].op1, &A[i].op2); 28 | de[A[i].op1] = de[A[i].op2] = 1; 29 | } else { 30 | scanf("%d", &A[i].op1); 31 | de[A[i].op1] = 1; 32 | } 33 | } 34 | while(de[++start]); 35 | printf("%.3lf\n", deal(0, start, N)); 36 | for (int i = 0; i < N; i++) { 37 | if (A[i].which == 0) printf("%.3lf%c", deal(1, start, i), --cnt ? ' ' : '\n'); 38 | } 39 | return 0; 40 | } -------------------------------------------------------------------------------- /L3-025 那就别担心了.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int N, M, S1, S2, A, B, consistency, laneNum[502]; 4 | vector Edge[502]; 5 | int dfs(int index) { 6 | if (laneNum[index] != 0) return laneNum[index]; 7 | for (int Next : Edge[index]) { 8 | if (laneNum[Next] == 0) dfs(Next); 9 | laneNum[index] += laneNum[Next]; 10 | } 11 | if (laneNum[index] == 0) consistency = 1; 12 | return laneNum[index]; 13 | } 14 | int main() { 15 | cin >> N >> M; 16 | for (int i = 0; i < M; ++i) { 17 | cin >> S1 >> S2; 18 | Edge[S1].push_back(S2); 19 | } 20 | cin >> A >> B; 21 | laneNum[B] = 1; 22 | dfs(A); 23 | cout << laneNum[A] << ' ' << (consistency ? "No" : "Yes"); 24 | return 0; 25 | } -------------------------------------------------------------------------------- /L3-028 森森旅游.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | #define pil pair 4 | struct node { 5 | int id; 6 | long long dis; 7 | friend int operator < (const node &a, const node &b) { 8 | return a.dis > b.dis; 9 | } 10 | }; 11 | int n, m, q, u, v, xi, vis1[100005], vis2[100005]; 12 | long long c, d, w, ai, huan[100005], cashD[100005], voucherD[100005], tran[100005]; 13 | vector cashE[100005], voucherE[100005]; 14 | multiset minCost; 15 | priority_queue Q; 16 | void Dijskra (int s, vector E[], long long Dis[], int Vis[]) { 17 | fill (Dis + 1, Dis + n + 1, LLONG_MAX); 18 | Dis[s] = 0; 19 | Q.push(node{s, 0}); 20 | while (!Q.empty()) { 21 | int now = Q.top().id; 22 | Q.pop(); 23 | if (Vis[now]) continue; 24 | Vis[now] = 1; 25 | for (int i = 0; i < (int)E[now].size(); ++i) { 26 | v = E[now][i].first; 27 | w = E[now][i].second; 28 | if (Dis[v] > Dis[now] + w) { 29 | Dis[v] = Dis[now] + w; 30 | Q.push(node{v, Dis[v]}); 31 | } 32 | } 33 | } 34 | } 35 | int main() { 36 | scanf("%d%d%d", &n, &m, &q); 37 | for (int i = 0; i < m; i++) { 38 | scanf("%d%d%lld%lld", &u, &v, &c, &d); 39 | cashE[u].push_back({v, c}); 40 | voucherE[v].push_back({u, d}); 41 | } 42 | for (int i = 1; i <= n; i++) scanf("%lld", &huan[i]); 43 | Dijskra(1, cashE, cashD, vis1); 44 | Dijskra(n, voucherE, voucherD, vis2); 45 | for (int i = 1; i <= n; i++) { 46 | if (cashD[i] == LLONG_MAX || voucherD[i] == LLONG_MAX) continue; 47 | minCost.insert(tran[i] = cashD[i] + (voucherD[i]+huan[i]-1) / huan[i]); 48 | } 49 | for (int i = 0; i < q; i++) { 50 | scanf("%d%lld", &xi, &ai); 51 | if (!tran[xi] || huan[xi] == ai) { 52 | printf("%lld\n", *minCost.begin()); 53 | } else { 54 | minCost.erase(minCost.find(tran[xi])); 55 | huan[xi] = ai; 56 | minCost.insert(tran[xi] = cashD[xi]+(voucherD[xi]+huan[xi]-1)/huan[xi]); 57 | printf("%lld\n", *minCost.begin()); 58 | } 59 | } 60 | return 0; 61 | } -------------------------------------------------------------------------------- /L3-029 还原文件.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int n, m, k, t, flag1, flag2; 4 | int h[100001], vis[101]; 5 | vector Ans, frag[101]; 6 | void DFS (int p) { 7 | if ((int)Ans.size() == m) { 8 | flag1 = 1; 9 | for (int i = 0; i < m; i++) { 10 | if (i) cout << ' '; 11 | cout << Ans[i]; 12 | } 13 | } 14 | if (flag1) return; 15 | for (int i = 1; i <= m; i++) { 16 | if (vis[i]) continue; 17 | flag2= 0; 18 | for (int j = 0; j < (int)frag[i].size(); j++) { 19 | if (frag[i][j] != h[p + j]) { 20 | flag2 = 1; 21 | break; 22 | } 23 | } 24 | if (flag2) continue; 25 | Ans.push_back(i); 26 | vis[i] = 1; 27 | DFS(p + (int)frag[i].size() - 1); 28 | vis[i] = 0; 29 | Ans.pop_back(); 30 | } 31 | }; 32 | int main() { 33 | cin >> n; 34 | for (int i = 0; i < n; i++) cin >> h[i]; 35 | cin >> m; 36 | for (int i = 1; i<= m; i++) { 37 | cin >> k; 38 | for (int j = 0; j < k; j++) { 39 | cin >> t; 40 | frag[i].push_back(t); 41 | } 42 | } 43 | DFS(0); 44 | return 0; 45 | } --------------------------------------------------------------------------------