#ifdef ONLINE_JUDGE
#else
freopen(“C:\Users\DD\Desktop\input.txt”, “r”, stdin);
freopen(“C:\Users\DD\Desktop\output.txt”,”w”,stdout);
#endif
// #ifdef ONLINE_JUDGE
// #else
// freopen(“/home/master/MOVE/doc/Documents/C/inandout/in.txt”, “r”, stdin);
// freopen(“/home/master/MOVE/doc/Documents/C/inandout/out.txt”, “w”, stdout);
// #endif
✔ 1001 A+B Format Score 20 0001
题目要求:
计算A+B的和,以每三位一个”,”的格式输出。
用s数组记录每3位的数字,然后按照格式输出。
1 |
|
✔ 1002 A+B for Polynomials Score 25 0001
相同次数的系数合并,统计系数不为0的项,输出。
a[exp] += num; 比如a[2]也就是x的平方的系数。exp = 0也就是常数项。
因为没有说同一行输入不会出现相同次数的项,因此要+=,当然+=也能很好地处理系数不同的问题。
求8x²-7x+5与3x²-4x+1的差。
解: (8x²-7x+5)-(3x²-4x+1)
=8x²-7x+5-3x²+4x-1
=5x²-3x+4
1 |
|
1003 Emergency (25 分)
1 |
|
1004 Counting Leaves
1 |
✔ 1005 Spell It Right Score 20 0001
题目大意:
输入一个数字,把数字的每一位相加,用英文输出最后总和的每一位数字。
因为输入的数字可能很大,所以用字符串的形式输入。即使每一位是9,和也不过是900罢了。
之后转换为字符串,输出每一位的数字。
1 |
|
✔1006 Sign In and Sign Out 0001
题目大意:
告诉你M个工作人员的出入记录,最早进门的人负责开门,最晚出门的负责关门。
请问,谁开的门和谁关的门。
总体思想是把所有人的进出时间统一到一个可以比较的刻度上,比如,进出时间是当天的第几秒。
之后用2个临时变量保存当前着的进出时间和最早和最晚比,更新最早和最晚时间。
输出最后结果。
1 |
|
✔ 1007 Maximum Subsequence Sum 0001
题目大意:
输出最大子序列和,以及首尾元素。
1 |
|
由于In case that the maximum subsequence is not unique, output the one with the smallest indices i and j (as shown by the sample case). 上面的temp要大于sum才更新。
✔ 1008 Elevator (20分) 0001
题目大意:
电梯的初始维持在0层,上升一层需要6秒,下降一层需要4秒,停止所花时间是4秒,问走完所给楼层需要多少时间。
往上是6秒/层,往下是4秒/层,每到一层要停5秒。第一个数字输入的是从0开始开门的次数。然后依次输入n个数计算即可。
1 |
|
✔ 1009 Product of Polynomials (25 分) 0000
题目大意:
求2个多项式A*B后的结果。
1 |
|
❌❌ 1010 Radix (25 分)
输入N1 N2 tag radix,tag指向第一个数字或则是第二个数字,radix是所选数字的进制数。
1 |
|
✔ 1011 World Cup Betting (20分) 0001
计算彩票最高的获利,在胜平败中选赔率最高的,并输出所选,最后计算获利。
1 |
|
❌ 1012 The Best Rank (25 分)
重点在于:
For each of the M students, print in one line the best rank for him/her, and the symbol of the corresponding rank, separated by a space.
全局变量,初始值为0,用i+1可以保证0输出N/A,对应的学生信息在stu[i-1]。
因为exist[stu[i].id] = i + 1;这一句。
1 |
|
1013 Battle Over Cities (25 分)
1 |
1014 Waiting in Line (30分)
✔1015 Reversible Primes (20 分)
给一个数和进制,判断此数字和翻转后是否依旧是素数。
1 |
|
1016 Phone Bills (25 分) UN
1 |
|
❌ 1017 Queueing at Bank (25 分)
1 |
|
1018 Public Bike Management (30分)
1019 General Palindromic Number (20 分)
备注:arr数组里是从低位到高位的数字。所以输出得从后到前。十进制转b进制也是取余。
1 |
|
1020 Tree Traversals (25 分)
定义结构体变量时,关键字struct可以省略吗?
在C++中可以bai,但在duc中不行zhi。
1 | typedef struct LNode{ |
1 |
|
1 |
|
❌ 1021 Deepest Root (25 分)
1 |
|
1022 Digital Library (30分)
1023 Have Fun with Numbers (20 分)
1 |
|
1024 Palindromic Number (25分)
题目大意:
1 |
1025 PAT Ranking (25 分)
1 |
|
题目要求:The locations are numbered from 1 to N. The output must be sorted in nondecreasing order of the final ranks. The testees with the same score must have the same rank, and the output must be sorted in nondecreasing order of their registration numbers.
也就是说,学生的排名和学号都是非递减。那么排名优先是按照分数高在前,低在后。
因此用return a.score != b.score ? a.score > b.score : a.no < b.no;也就说,分数不同时,分数高优先,分数相同时,学号小优先。
1026 Table Tennis (30分)
1027 Colors in Mars (20 分)
1 |
|
1028 List Sorting (25 分)
1 |
|
1029 Median (25 分)
1 |
|
1030 Travel Plan (30分)
1031 Hello World for U (20 分)
1 |
|
1032 Sharing (25 分)
1 |
|
❌ 1033 To Fill or Not to Fill (25 分)
For each test case, print the cheapest price in a line, accurate up to 2 decimal places. It is assumed that the tank is empty at the beginning. If it is impossible to reach the destination, print The maximum travel distance = X where X is the maximum possible distance the car can run, accurate up to 2 decimal places.
1 |
|
1034 Head of a Gang (30分)
1035 Password (20 分)
1 |
|
# 1036 Boys vs Girls (25 分)
1 |
|
1037 Magic Coupon (25 分)
For example, given a set of coupons { 1 2 4 −1 }, and a set of product values { 7 6 −2 −3 } (in Mars dollars M$) where a negative value corresponds to a bonus product. You can apply coupon 3 (with N being 4) to product 1 (with value M$7) to get M$28 back; coupon 2 to product 2 to get M$12 back; and coupon 4 to product 4 to get M$3 back. On the other hand, if you apply coupon 3 to product 4, you will have to pay M$12 to the shop.
2个数组排序,然后负数乘负数,正数乘正数,累加。注意2个指针的边界问题。
1 |
|
1038 Recover the Smallest Number (30分)
1039 Course List for Student (25 分)
告诉你有多少学生,多少门课,然后是每一门课的报考学生。输出每个学生的报考科目。
1 |
|
❌⭕ 1040 Longest Symmetric String (25 分) 对递推方程还是有疑虑
1 |
|
1041 Be Unique (20 分)
1 |
|
1042 Shuffling Machine (20 分)
1 |
|
❌ 1043 Is It a Binary Search Tree (25 分)
1 |
|
1044 Shopping in Mars (25 分)
给一串数字,子序列之和为M。
For each test case, print i-j in a line for each pair of i ≤ j such that Di + … + Dj = M. Note that if there are more than one solution, all the solutions must be printed in increasing order of i.
如果没有符合条件,使子序列之和-M最小。
If there is no solution, output i-j for pairs of i ≤ j such that Di + … + Dj >M with (Di + … + Dj −M) minimized. Again all the solutions must be printed in increasing order of i.
1 |
|
1045 Favorite Color Stripe (30分)
重点在Eva is trying to make her own color stripe out of a given one. She would like to keep only her favorite colors in her favorite order by cutting off those unwanted pieces and sewing the remaining parts together to form her favorite color stripe.
从给的例子可以看出,要求保持喜欢颜色的先后顺序,并且使最后条纹的长度尽可能长。(喜欢的颜色可以不出现)
以
6
5 2 3 1 5 6
12 2 2 4 1 5 5 6 3 1 1 5 6
为列,6表示总共6种颜色,5表示喜欢5中颜色,之后是喜欢颜色的优先级顺序。
12表示原条纹的颜色排列,之后依次是12种颜色。
1 |
|
1046 Shortest Distance (20 分)
地铁环状线两点之间的距离为t,最小值为t或则是周长-t。(t为按起点到终点由小到大,大减小而来)
1 |
|
1047 Student List for Course (25分)
给出学生人数N和学科数K。
接着是N行,每一行是每个学生报名的科目。
输出每一门课有几个学生报名,分别是谁。
1 |
|
1048 Find Coins (25 分)
输入N和M,N是你手尚有的硬币数量,M为要求支付的金额。
接下来是N个数字,为硬币的面额。
注意相同金额的硬币可能有多个。输出要求V1+V2=M,V1<=V2,有多种结果取V1最小的。
面额不大于1000,所以从0到1000开始遍历,当前面额银币有,用掉,用掉的必须小于需要支付的金额。
再看,剩下金额的硬币手里是否有,有责直接输出,结束。
如果行不通,当然,拿出来的硬币要放回去。
1 |
|
1049 Counting Ones (30分)
给一个数N,问再十进制下,从1到N,出现1的次数。
??????
题目大意:给出一个数字n,求1~n的所有数字里面出现1的个数
分析:这是一道数学问题。从第一位(个位)到最高位,设now为当前位的数字,left为now左边的所有数字构成的数字,right是now右边的所有数字构成的数字。只需要一次次累加对于当前位now来说可能出现1的个数,然后把它们累加即可。a表示当前的个位为1,十位为10,百位为100类推。
对于now,有三种情况:
1.now == 0 : 那么 ans += left a; //因为now==0说明now位只有在left从0~left-1的时候会产生1,所以会产生left次,但是又因为右边会重复从0~999…出现a次
2.now == 1 : ans += left a + right + 1;//now = 1的时候就要比上一步多加一个当now为1的时候右边出现0~right个数导致的now为1的次数
3.now >= 2 : ans += (left + 1) * a;//now大于等于2就左边0~left的时候会在now位置产生1,所以会产生left次,但是又因为右边会重复从0~999…出现a次
1 |
|
1050 String Subtraction (20 分)
1 |
|
1051 Pop Sequence (25 分)
M,栈的最大容量,N出栈序列的长度,K个出栈序列等待检查。
1 |
|
1052 Linked List Sorting (25分)
给出n个节点,把链表中的节点按照key值从小到大排列。
1 |
|
1053 Path of Equal Weight (30分)
1054 The Dominant Color (20 分)
注意输入的分辨率是M列N行,虽然和平时输入有点不一样但和像素是一样的,1024x768,1024是长,768是宽。
1 |
|
1055 The World’s Richest (25 分)
模拟一个福布斯分类排行榜。给N个人的名字,年龄,财富。
给K个筛选标准,包括M最大输出人数(最多100人),年龄范围。
之后按照:The outputs must be in non-increasing order of the net worths. In case there are equal worths, it must be in non-decreasing order of the ages. If both worths and ages are the same, then the output must be in non-decreasing alphabetical order of the names. It is guaranteed that there is no two persons share all the same of the three pieces of information. In case no one is found, output None.输出。
钱多的优先,年龄小的优先,名字字典序小的优先。
为什么vt[i].name没有&?
首先说明 %s格式符 表示用来输入出一个字符串 而字符串是以数组的形式的存储的
c语言中数组名代表该数组的起始地址。 此处,a为数组名 代表的是首地址,所以就不用取地址符了, 再用取地址符号 就重复了 请注意与%c的区别 理解就好啦。
1 |
|
1056 Mice and Rice (25 分)
输入n为老鼠数量,g为每一组老鼠的最大值,之后从0到n-1个老鼠的体重,最后是老鼠体重的比较序列。
对于每一组老鼠,选出最重的那个,晋级下一轮,本轮的其他老鼠名次相同,直到选出第一名。
结构体node表示老鼠,里面包括weight重量,index是按照排名后的顺序的老鼠的下标,index0是排名前老鼠的下标。rank是最终要输出的老鼠的排名。
1 |
|
另一个参考:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using namespace std;
int main(){
int n, m, x;
cin >> n >> m;
vector<int> mice(n);
vector<int> order(n);
int rank[n];
fill(rank,rank+n,0);
for (int i = 0; i < n; ++i) {
cin>>mice[i];
}
for (int i = 0; i < n; ++i) {
cin>>order[i];
}
vector<int> res;
int Max, idex, group;
while (order.size()>1) {
group = order.size() / m + 1;
if ((order.size() % m != 0) ) ++group;
for (int i = 0; i < order.size(); ++i) {
if (i%m == 0) {
Max = -1;
if (i != 0) {
res.push_back(idex);
}
}
if (Max < mice[order[i]]) {
Max = mice[order[i]];
idex = order[i];
}
rank[order[i]] = group;
}
res.push_back(idex);
order = res;
res.clear();
}
rank[order[0]] = 1;
for (int i = 0; i < n; ++i) {
if (i != 0) cout << ' ';
cout << rank[i];
}
return 0;
}
原文链接:https://blog.csdn.net/CV_Jason/java/article/details/85238006
1057 Stack (30分)
实现一种特殊的栈,增加一种“查找中位数”的功能,返回栈中所有元素的中值。如果n为偶数,则为第n/2的数字,若n是奇数,则是(n+1)/2的数字。
1 |
|
1058 A+B in Hogwarts (20 分)
货币转换,“Seventeen silver Sickles to a Galleon and twenty-nine Knuts to a Sickle, it’s easy enough.”
sum = sum % (17 29)的值最大为28+1629 < 17*29。
1 |
|
1059 Prime Factors (25 分)
1 |
|
输出十万内的素数。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using namespace std;
vector<int> prime(100000, 1);
int main() {
// freopen("1.txt", "r", stdin);
freopen("out.txt","w",stdout);
for (int i = 2; i * i < 100000; i++) {
for (int j = 2; j * i < 100000; j++) {
prime[i * j] = 0;
}
}
printf("2");
for (int i = 3; i < 100000; i++) {
if (prime[i]) printf(" %d", i);
}
return 0;
}
5万以后的素质:
49939 49943 49957 49991 49993 49999 50021 50023 50033 50047 50051 50053 50069 50077 50087 50093 50101 50111 50119 50123 50129 50131 50147 50153 50159 50177 50207 50221 50227 50231 50261 50263 50273 50287 50291 50311 50321 50329 50333 50341 50359 50363 50377 50383 50387 50411 50417 50423 50441 50459 50461 50497 50503 50513 50527 50539 50543 50549 50551 50581 50587 50591 50593 50599 50627 50647 50651 50671 50683 50707 50723 50741 50753 50767 50773 50777 50789 50821 50833 50839 50849 50857 50867 50873 50891 50893 50909 50923 50929 50951 50957 50969 50971 50989 50993 51001 51031 51043 51047 51059 51061 51071 51109 51131 51133 51137 51151 51157 51169 51193 51197 51199 51203 51217 51229 51239 51241 51257 51263 51283 51287 51307 51329 51341 51343 51347 51349 51361 51383 51407 51413 51419 51421 51427 51431 51437 51439 51449 51461 51473 51479 51481 51487 51503 51511 51517 51521 51539 51551 51563 51577 51581 51593
sqrt(1.0 * INT32_MAX)的值。1
2
3
4
5
6
7
8
9
10
11
12
using namespace std;
int main() {
int res = sqrt(1.0 * INT32_MAX);
printf("%d", res);
return 0;
}
46340
会出现重复情况吗?会的。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using namespace std;
vector<int> prime(100000, 1);
int main() {
// freopen("1.txt", "r", stdin);
freopen("out.txt","w",stdout);
int cnt = 0;
for (int i = 2; i * i < 100; i++) {
for (int j = 2; j * i < 100; j++) {
prime[i * j] = 0;
printf("%2d %2d %3d ", i, j, i * j);
cnt++;
if (cnt % 5 == 0) printf("\n");
}
}
printf("\n");
printf("cnt = %d\n\n", cnt);
printf("2");
for (int i = 3; i < 100; i++) {
if (prime[i]) printf(" %d", i);
}
return 0;
}
2 2 4 2 3 6 2 4 8 2 5 10 2 6 12
2 7 14 2 8 16 2 9 18 2 10 20 2 11 22
2 12 24 2 13 26 2 14 28 2 15 30 2 16 32
2 17 34 2 18 36 2 19 38 2 20 40 2 21 42
2 22 44 2 23 46 2 24 48 2 25 50 2 26 52
2 27 54 2 28 56 2 29 58 2 30 60 2 31 62
2 32 64 2 33 66 2 34 68 2 35 70 2 36 72
2 37 74 2 38 76 2 39 78 2 40 80 2 41 82
2 42 84 2 43 86 2 44 88 2 45 90 2 46 92
2 47 94 2 48 96 2 49 98 3 2 6 3 3 9
3 4 12 3 5 15 3 6 18 3 7 21 3 8 24
3 9 27 3 10 30 3 11 33 3 12 36 3 13 39
3 14 42 3 15 45 3 16 48 3 17 51 3 18 54
3 19 57 3 20 60 3 21 63 3 22 66 3 23 69
3 24 72 3 25 75 3 26 78 3 27 81 3 28 84
3 29 87 3 30 90 3 31 93 3 32 96 3 33 99
4 2 8 4 3 12 4 4 16 4 5 20 4 6 24
4 7 28 4 8 32 4 9 36 4 10 40 4 11 44
4 12 48 4 13 52 4 14 56 4 15 60 4 16 64
4 17 68 4 18 72 4 19 76 4 20 80 4 21 84
4 22 88 4 23 92 4 24 96 5 2 10 5 3 15
5 4 20 5 5 25 5 6 30 5 7 35 5 8 40
5 9 45 5 10 50 5 11 55 5 12 60 5 13 65
5 14 70 5 15 75 5 16 80 5 17 85 5 18 90
5 19 95 6 2 12 6 3 18 6 4 24 6 5 30
6 6 36 6 7 42 6 8 48 6 9 54 6 10 60
6 11 66 6 12 72 6 13 78 6 14 84 6 15 90
6 16 96 7 2 14 7 3 21 7 4 28 7 5 35
7 6 42 7 7 49 7 8 56 7 9 63 7 10 70
7 11 77 7 12 84 7 13 91 7 14 98 8 2 16
8 3 24 8 4 32 8 5 40 8 6 48 8 7 56
8 8 64 8 9 72 8 10 80 8 11 88 8 12 96
9 2 18 9 3 27 9 4 36 9 5 45 9 6 54
9 7 63 9 8 72 9 9 81 9 10 90 9 11 99
cnt = 170
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
PS:
打印素数的几种方法及其优化
https://blog.csdn.net/aixiaodeshushu/article/details/81429285
1060 Are They Equal (25 分)
1 |
|
1061 Dating (20 分)
1 |
|
1062 Talent and Virtue (25分)
题目要求,输入N,参与排名的人数,L,参与排名的及格分数要求,H,参与排名优秀非分数要求。德与才均不低于H的成为圣人,按总分由高到低排列(will be ranked in non-increasing order according to their total grades.)才低于H,而德不低于者成为君子,德才均低于H,但德不低于才的成为愚人,剩下的称为小人,按照圣人君子愚人小人排列,同一种人按照总分非递增排列。
1 |
|
1063 Set Similarity (25分)
1 |
|
1064 Complete Binary Search Tree (30分)
1065 A+B and C (64bit) (20 分)
1 |
|
因为A、B的大小为[-2^63, 2^63],用long long 存储A和B的值,以及他们相加的值sum:
如果A > 0, B < 0 或者 A < 0, B > 0,sum是不可能溢出的
如果A > 0, B > 0,sum可能会溢出,sum范围理应为(0, 2^64 – 2],最大难道不是2的64次方吗为什么还有-2?溢出得到的结果应该是[-2^63, -2]是个负数,所以sum < 0时候说明溢出了
如果A < 0, B < 0,sum可能会溢出,同理,sum溢出后结果是大于0的,所以sum > 0 说明溢出了
1066 Root of AVL Tree (25分)
1067 Sort with Swap(0, i) (25分)
1 |
|
cin >> t; a[t] = i; 表示数字t的位置在i。
1068 Find More Coins (30分)
1 |
|
1069 The Black Hole of Numbers
1 |
|
1070 Mooncake (25分)
给出仓库容量,不同种类月饼的库存和总价值,问把仓库装满后,最高的货值是多少。采购单价高的,若有空余,采购次高者,以此类推。
1 |
|
1071 Speech Patterns (25分)
输出出现最多的那个字符串(字母和数字的组合),不区分大小写。
因为输入中可能有空格,因此用getline(cin, s);输入。
空字符串的个数不应该被统计,因此t长度不为0。
1 |
|
1072 Gas Station (30分)
1073 Scientific Notation (20 分)
stoi(字符串,起始位置,n进制),将 n 进制的字符串转化为十进制。1
2string str = "1010";
int a = stoi(str, 0, 2);
结果是10。
题目大意:题目给出科学计数法的格式的数字A,要求输出普通数字表示法的A,并保证所有有效位都被保留,包括末尾的0
分析:n保存E后面的字符串所对应的数字,t保存E前面的字符串,不包括符号位。当n<0时表示向前移动,那么先输出0. 然后输出abs(n)-1个0,然后继续输出t中的所有数字;当n>0时候表示向后移动,那么先输出第一个字符,然后将t中尽可能输出n个字符,如果t已经输出到最后一个字符(j == t.length())那么就在后面补n-cnt个0,否则就补充一个小数点。 然后继续输出t剩余的没有输出的字符~
1 |
|
1074 Reversing Linked List (25分)
分析:把地址为temp的数的数值存入data[temp]中,把temp的下一个结点的地址存入next[temp]中。
注意:不一定所有的输入的结点都是有用的,加个计数器sum
1 |
|
1075 PAT Judge (25分)
1 |
|
1076 Forwards on Weibo (30分)
1 |
|
1077 Kuchiguse (20 分)
重点在于For each test case, print in one line the kuchiguse of the character, i.e., the longest common suffix of all N lines. If there is no such suffix, write nai.
求给出字符串的公共后缀。
1 |
|
1078 Hashing (25 分)
给出散列表长度以及插入的元素,问插入位置。
重点在于判断是否为素数(保证散列表长度为素数),以及二次探测法(寻找元素插入位置)。
1 |
|
1079 Total Sales of Supply Chain (25分)
pow()函数:求x的y次方的值。
叶子节点为零售商,data保存销售商品的数量,child向量保存子节点。
DFS深度搜索查找叶子节点,累加销售额。
最后再乘以价格p。
1 |
|
1080 Graduate Admission (30分)
1081 Rational Sum (20 分)
每计算一次都计算分子分母的最大公约数,再约分。
1 |
|
1082 Read Number in Chinese (25分)
1 |
|
1083 List Grades (25分)
因为保证每个人的grade不同,所以从高到低排序就可以,不用考虑相同的情况。
不在区间内的,grade赋值-1,往后放,else满足条件的计数cnt++。
1 |
|
1084 Broken Keyboard (20 分)
s2没有出现s1中的字符,并且转换大写后没有出现在答案中(答案不用重复出现相同),把这个字符加入答案。
1 |
|
1085 Perfect Sequence (25分)
当res发生变化后,for循环里是用的老res还是新的??应该是新的。
1 |
|
1086 Tree Traversals Again (25分)
入栈顺序是二叉树的前序遍历,出栈顺序是中序遍历。已知这2两个的顺序,就可以确定一颗树。要求输出这一棵树的后序遍历。
root为当前子树的根结点在前序pre中的下标,start和end为当前子树的最左边和最右边的结点在中序in中的下标。用i找到当前子树的根结点root在中序中的下标,然后左边和右边就分别为当前根结点root的左子树和右子树。递归实现1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using namespace std;
vector<int> pre, in, post, value;
void postorder(int root, int start, int end) {
if (start > end) return;
int i = start;
while (i < end && in[i] != pre[root]) i++;
postorder(root + 1, start, i - 1);
postorder(root + 1 + i - start, i + 1, end);
post.push_back(pre[root]);
}
int main() {
int n;
scanf("%d", &n);
char str[5];
stack<int> s;
int key=0;
while (~scanf("%s", str)) {
if (strlen(str) == 4) {
int num;
scanf("%d", &num);
value.push_back(num);
pre.push_back(key);
s.push(key++);
} else {
in.push_back(s.top());
s.pop();
}
}
postorder(0, 0, n - 1);
printf("%d", value[post[0]]);
for (int i = 1; i < n; i++)
printf(" %d",value[post[i]]);
return 0;
}
另外一个1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
int N,cur;
vector<int> preOrder;
vector<int> inOrder;
typedef struct TreeNode *Node;
struct TreeNode{
int num;
Node left,right;
TreeNode(){
left = NULL;
right = NULL;
}
};
int findRootIndex(int rootNum){
for(int i = 0;i < N; i++){
if(inOrder[i] == rootNum){
return i;
}
}
return -1;
}
Node CreateTree(int left, int right){
if(left > right) return NULL;
int root = preOrder[cur];
cur++;
int rootIndex = findRootIndex(root);
Node T = new TreeNode();
T->num = root;
if(left != right){
T->left = CreateTree(left,rootIndex-1);
T->right = CreateTree(rootIndex+1,right);
}
return T;
}
bool firstOutPut = true;
void PostOrder(Node T){
if(!T) return;
PostOrder(T->left);
PostOrder(T->right);
if(firstOutPut){
printf("%d",T->num);
firstOutPut = false;
}else{
printf(" %d",T->num);
}
}
int main()
{
stringstream ss;
string Nstr;
getline(cin,Nstr);
ss << Nstr;
ss >> N;
ss.clear();
string input;
stack<int> stk;
int value;
for(int i = 0; i < N * 2; i++){
getline(cin,input);
if(input[1] == 'u'){
string num = input.substr(5);
ss << num;
ss >> value;
ss.clear();
stk.push(value);
preOrder.push_back(value);
}else{
value = stk.top();
stk.pop();
inOrder.push_back(value);
}
}
Node T = CreateTree(0,N-1);
PostOrder(T);
return 0;
}
1087 All Roads Lead to Rome (30分)
1088 Rational Arithmetic (20 分) !!!
给2个有理数,分别计算它们的相加相减相乘相处后的结果,并按要求格式输出。
重点在这个格式化有理数的函数f。
1 |
|
1089 Insert or Merge (25分)
给一个原始序列和一个用某种排序算法产生的中间序列,问用的是那种排序方法(插入还是并归),并输出最后排序的结果。
直到a模拟到b的状态前,都会一直归并下去,直到a和b一样,这时候,flag为0,再并归一次即是结果。
1 |
|
1090 Highest Price in Supply Chain (25分)
重点在于理解这一句:
each number Si is the index of the supplier for the i-th member.
Si是第i个节点的父节点编号。
1 |
|
1091 Acute Stroke (30分)
1092 To Buy or Not to Buy (20 分)
1 |
|
1093 Count PAT’s (25分)
1 |
|
1094 The Largest Generation (25分)
DPS, 统计树的高度,以及每一层的结点个数,输出结点最多的是多少个以及哪一层。
1 |
|
BFS1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36vector<int> v[100];
int level[100];
int book[100];
int main() {
int n, m, a, k, c;
scanf("%d %d", &n, &m);
for(int i = 0; i < m; i++) {
scanf("%d %d",&a, &k);
for(int j = 0; j < k; j++) {
scanf("%d", &c);
v[a].push_back(c);
}
}
queue<int> q;
q.push(1);
level[1] = 1;
while(!q.empty()) {
int index = q.front();
q.pop();
book[level[index]]++;
for(int i = 0; i < v[index].size(); i++) {
level[v[index][i]] = level[index] + 1;
q.push(v[index][i]);
}
}
int maxnum = 0, maxlevel = 1;
for(int i = 1; i < 100; i++) {
if(book[i] > maxnum) {
maxnum = book[i];
maxlevel = i;
}
}
printf("%d %d", maxnum, maxlevel);
return 0;
}
1095 Cars on Campus (30分)
1096 Consecutive Factors (20 分)
输入一个数字,问是否能拆成或干个连续整数的连乘,即连续数字的连乘是否是输入数字的因数。
1 |
|
1097 Deduplication on a Linked List (25分)
去重(绝对值相等也算)。输出去重后的链表和删除的链表。
很巧妙的做法,给一个初始值的索引,2倍的maxn,然后[0,maxn)放去重后的,[maxn, maxn * 2)放多余的。然后输出。
1 |
|
1098 Insertion or Heap Sort (25分)
题目大意:给出n和n个数的序列a和b,a为原始序列,b为排序其中的一个步骤,问b是a经过了堆排序还是插入排序的,并且输出它的下一步~
分析:插入排序的特点是:b数组前面的顺序是从小到大的,后面的顺序不一定,但是一定和原序列的后面的顺序相同~所以只要遍历一下前面几位,遇到不是从小到大的时候,开始看b和a是不是对应位置的值相等,相等就说明是插入排序,否则就是堆排序啦~
插入排序的下一步就是把第一个不符合从小到大的顺序的那个元素插入到前面已排序的里面的合适的位置,那么只要对前几个已排序的+后面一位这个序列sort排序即可~while(p <= n && b[p – 1] <= b[p]) p++;int index = p;找到第一个不满足条件的下标p并且赋值给index,b数组下标从1开始,所以插入排序的下一步就是sort(b.begin() + 1, b.begin() + index + 1)后的b数组~
堆排序的特点是后面是从小到大的,前面的顺序不一定,又因为是从小到大排列,堆排序之前堆为大顶堆,前面未排序的序列的最大值为b[1],那么就可以从n开始往前找,找第一个小于等于b[1]的数字b[p](while(p > 2 && b[p] >= b[1]) p–;),把它和第一个数字交换(swap(b[1], b[p]);),然后把数组b在1~p-1区间进行一次向下调整(downAdjust(b, 1, p – 1);)~向下调整,low和high是需要调整的区间,因为是大顶堆,就是不断比较当前结点和自己的孩子结点哪个大,如果孩子大就把孩子结点和自己交换,然后再不断调整直到到达区间的最大值不能再继续了为止~
1 | void downAdjust(vector<int> &b, int low, int high) { |
1099 Build A Binary Search Tree (30分)
1100 Mars Numbers (20 分)
题目大意:火星人是以13进制计数的:地球人的0被火星人称为tret。地球人数字1到12的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。火星人将进位以后的12个高位数字分别称为:tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou。例如地球人的数字“29”翻译成火星文就是“hel mar”;而火星文“elo nov”对应地球数字“115”。为了方便交流,请你编写程序实现地球和火星数字之间的互译~
分析:因为给出的可能是数字(地球文)也有可能是字母(火星文),所以用字符串s保存每一次的输入,因为如果是火星文则会出现空格,所以用getline接收一行的输入~计算string s的长度len,判断s[0]是否是数字,如果是数字,表示是地球文,则需要转为火星文,执行func1();如果不是数字,则说明是火星文,需要转为地球文,执行func2();
func1(int t)中,传入的值是string转int后的结果stoi(s),因为数字最大不超过168,所以最多只会输出两位火星文,如果t / 13不等于0,说明有高位,所以输出b[t/13];如果输出了高位(t/13不等于0)并且t % 13不等于0,说明有高位且有低位,所以此时输出空格;如果t % 13不等于0,说明有低位,此时输出a[t % 13];注意,还有个数字0没有考虑,因为数字0取余13等于0,但是要特别输出tret,所以在func1的最后一句判断中加一句t == 0,并将a[0]位赋值成tret即可解决0的问题~
func2()中,t1和t2一开始都赋值0,s1和s2用来分离火星文单词,因为火星文字符串只可能一个单词或者两个单词,而且一个单词不会超过4,所以先将一个单词的赋值给s1,即s1 = s.substr(0, 3);如果len > 4,就将剩下的一个单词赋值给s2,即s2 = s.substr(4, 3);然后下标j从1到12遍历a和b两个数组,如果a数组中有和s1或者s2相等的,说明低位等于j,则将j赋值给t2;如果b数组中有和s1相等的(b数组不会和s2相等,因为如果有两个单词,s2只可能是低位),说明高位有值,将j赋值给t1,最后输出t1 * 13 + t2即可~1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using namespace std;
string a[13] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
string b[13] = {"####", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
string s;
int len;
void toMars(int n) {
if (n / 13) cout << b[n / 13];
if ((n / 13) && (n % 13)) cout << " ";
if (n % 13 || n == 0) cout << a[n % 13];
}
void toEarth() {
int t1 = 0, t2 = 0;
string s1 = s.substr(0, 3), s2;
if (len > 4) s2 = s.substr(4, 3);
for (int i = 0; i <= 12; i++) {
if (s1 == a[i] || s2 == a[i]) t2 = i;
if (s1 == b[i]) t1 = i;
}
cout << t1 * 13 + t2;
}
int main() {
int n;
cin >> n;
getchar(); // 用来接收回车的。
for (int i = 0; i < n; i++) {
getline(cin, s);
len = s.length();
if (s[0] >= '0' && s[0] <= '9') {
toMars(stoi(s));
} else {
toEarth();
}
cout << endl;
}
return 0;
}
4
29
5
elo nov
tam
hel mar
may
115
13
1101 Quick Sort (25分)
输入n个不同的数字,问有几个可以当快速排序的分割点pivot。输出个数以及是哪几个数字。左边要么没有要么都比pivot小,右边要么没有要么比pivot大。(题目中已经保证所有输入数字都不同)
pivot的位置与排序后的位置一致。(左小右大,分别排序左右即可,它不用动)并且要求pivot比左边最大的还大,比右边最小的还小。
1 |
|
1102 Invert a Binary Tree (25分)
题目大意:反转一棵二叉树,给出原二叉树的每个结点的左右孩子,输出它的层序和中序遍历~
分析:1. 反转二叉树就是存储的时候所有左右结点都交换。
- 二叉树使用{id, l, r, index, level}存储每个结点的id, 左右结点,下标值,和当前层数~
- 根结点是所有左右结点中没有出现的那个结点~
- 已知根结点,用递归的方法可以把中序遍历的结果push_back到数组v1里面,直接输出就是中序,排序输出就是层序(排序方式,层数小的排前面,相同层数时,index大的排前面)
1 | struct node { |
1103 Integer Factorization (30分)
1104 Sum of Number Segments (20 分)
1 |
|
1105 Spiral Matrix (25分)
1 | int cmp(int a, int b) {return a > b;} |
1106 Lowest Price in Supply Chain (25分)
问到消费者手里最低价是多少,有几个零售商满足要求。也就是是中间商最少的,高度最低的叶子节点。
1 | vector<int> v[100005]; |
1107 Social Clusters (30分)
1108 Finding Average (20 分)
1 |
|
1109 Group Photo (25分)
题目大意:拍集体照时队形很重要,这里对给定的N个人K排的队形设计排队规则如下:
每排人数为N/K(向下取整),多出来的人全部站在最后一排;后排所有人的个子都不比前排任何人矮;每排中最高者站中间(中间位置为m/2+1,其中m为该排人数,除法向下取整);每排其他人以中间人为轴,按身高非增序,先右后左交替入队站在中间人的两侧(例如5人身高为190、188、186、175、170,则队形为175、188、190、186、170。这里假设你面对拍照者,所以你的左边是中间人的右边);若多人身高相同,则按名字的字典序升序排列。这里保证无重名。现给定一组拍照人,请编写程序输出他们的队形。输出拍照的队形。即K排人名,其间以空格分隔,行末不得有多余空格。注意:假设你面对拍照者,后排的人输出在上方,前排输出在下方~
分析:建立结构体node,里面包含string类型的姓名name和int类型的身高height~将学生的信息输入到node类型的vector数组stu中~然后对stu数组进行排序(cmp函数表示排序规则,如果身高不等,就按照身高从大到小排列;如果身高相等,就按照名字从小到大的字典序排列~)然后用while循环排列每一行,将每一行应该排列的结果的姓名保存在ans数组中~
因为是面对拍照者,后排的人输出在上方,前排输出在下方,每排人数为N/K(向下取整),多出来的人全部站在最后一排,所以第一排输出的应该是包含多出来的人,所以while循环体中,当row == k时,表示当前是在排列第一行,那么这一行的人数m应该等于总人数n减去后面的k列(k-1)行,即m = n – n / k (k-1);如果不是第一行,那么m直接等于n / k;最中间一个学生应该排在m/2的下标位置,即ans[m / 2] = stu[t].name;然后排左边一列,ans数组的下标 j 从m/2-1开始,一直往左j–,而对于stu的下标 i,是从t+1开始,每次隔一个人选取(即i = i+2,因为另一些人的名字是给右边的),每次把stu[i]的name赋值给ans[j–];排右边的队伍同理,ans数组的下标 j 从m/2 + 1开始,一直往右j++,stu的下标 i,从t+2开始,每次隔一个人选取(i = i+2),每次把stu[i]的name赋值给ans[j++],然后输出当前已经排好的ans数组~每一次排完一列row-1,直到row等于0时退出循环表示已经排列并输出所有的行~
1 |
|
1110 Complete Binary Tree (25分)
题目大意:给出一个n表示有n个结点,这n个结点为0~n-1,给出这n个结点的左右孩子,求问这棵树是不是完全二叉树
分析:递归出最大的下标值,完全二叉树一定把前面的下标充满: 最大的下标值 == 最大的节点数;不完全二叉树前满一定有位置是空,会往后挤: 最大的下标值 > 最大的节点数~
1 |
|
1111 Online Map (30分)
1112 Stucked Keyboard (20分)
键盘的某些按键黏住了,按一次重复k次,找出可能粘住的按键以及输出正确的顺序。
1 | bool sureNoBroken[256]; // 确定不是坏件 |
1113 Integer Set Partition (25分)
给n个数,分成2个集合,个数为n1,n2,每个集合的和为s1,s2,要求个数相减尽可能小,和相差尽可能大。
排序取一半即可。sum - 2 * halfsum用sum - halfsum - halfsum就更清楚了。
1 | int main() { |
1114 Family Property (25分)
题目大意:给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。首先在第一行输出家庭个数(所有有亲属关系的人都属于同一个家庭)。随后按下列格式输出每个家庭的信息:家庭成员的最小编号 家庭人口数 人均房产套数 人均房产面积。其中人均值要求保留小数点后3位。家庭信息首先按人均面积降序输出,若有并列,则按成员编号的升序输出。
分析:用并查集。分别用两个结构体数组,一个data用来接收数据,接收的时候顺便实现了并查集的操作union,另一个数组ans用来输出最后的答案,因为要计算家庭人数,所以用visit标记所有出现过的结点,对于每个结点的父结点,people++统计人数。标记flag == true,计算true的个数cnt就可以知道一共有多少个家庭。排序后输出前cnt个就是所求答案~~
并查集??????
1 | struct DATA { |
1115 Counting Nodes in a BST (30分)
1116 Come on! Let’s C (20分)
分析:ran数组标记每个id对应的排名,集合ss存储所有已经询问过的id,如果发现当前id已经出现在ss中,则输出“Checked”,如果ran[id] == 0说明当前id不在排名列表中,所以输出“Are you kidding?”,如果ran[id]为1则输出“Minion”,如果ran[id]为素数则输出“Mystery Award”,否则输出“Chocolate”
1 | int ran[10000]; |
1117 Eddington Number (25分)
题目大意:英国天文学家爱丁顿很喜欢骑车。据说他为了炫耀自己的骑车功力,还定义了一个“爱丁顿数”E,即满足有E天骑车超过E英里的最大整数E。据说爱丁顿自己的E等于87。
分析:在数组a中存储n天的公里数,对n个数据从大到小排序,根据排序后的数组可得知骑车大于等于 a[i] 英里的天数有 i+1 天,因为题目中要求超过E英里且所有的英里数为整数,所以可得知骑车超过 a[i]-1 英里的天数有 i+1 天,如样例,从大到小排序后结果为10、9、8、8、7、7、6、6、3、2,骑车超过9英里的有1天,超过8英里的有2天,超过7英里的有4天/5天,超过6英里的有5天/6天,超过5英里的有7天/8天…英里数不断减少,天数不断增加,既然已知公里数和天数对应的关系,要想满足题意,必须使超过的英里数a[i]-1大于等于天数i+1(比如样例中,超过6英里的有6天,超过5英里的有7天,前者的天数6满足题意这6天都超过了6英里,后者的天数7不满足因为这7天只满足骑车都超过5英里)即a[i]-1 >= i+1,也就是 a[i] >= i + 2,也就是a[i] > i + 1~从头到尾遍历数组,那么满足a[i] > i+1的最大i+1即为所求
1 | int a[1000000]; |
greater
greater表示内置类型从大到小排序,less表示内置类型从小到大排序。
1118 Birds in Forest (25分)
1119 Pre- and Post-order Traversals (30分)
1120 Friend Numbers (20分)
1 | int getFriendNum(int num) { |
1121 Damn Single (25分)
分析: 设立数组couple[i] = j表示i的对象是j。一开始先设置为都是-1。设立数组isExist表示某人的对象是否来到了派对上。接收数据的时候,对于每一对a和b,将couple的a设置为b,b设置为a,表示他俩是一对。对于每一个需要判断的人,将其存储在guest数组里面,如果它不是单身的(也就是如果它的couple[guest[i]] != -1)那么就将它对象的isExist设置为1,表示他对象的对象(也就是他自己)来到了派对。这样所有isExist不为1的人,对象是没有来到派对的。把所有的人遍历后插入一个集合set里面,set的size就是所求的人数,set里面的所有数就是所求的人的递增排列~~~
1 | int main() { |
1122 Hamiltonian Cycle (25分)
题目大意:给出一个图,判断给定的路径是不是哈密尔顿路径
分析:1.设置falg1 判断节点是否多走、少走、或走成环
2.设置flag2 判断这条路能不能走通
3.当falg1、flag2都为1时是哈密尔顿路径,否则不是
1 | int main() { |
1123 Is It a Complete AVL Tree (30分)
1124 Raffle for Weibo Followers (20分)
题目大意:小明PAT考了满分,高兴之余决定发起微博转发抽奖活动,从转发的网友中按顺序每隔N个人就发出一个红包。请你编写程序帮助他确定中奖名单。注意:可能有人转发多次,但不能中奖多次。所以如果处于当前中奖位置的网友已经中过奖,则跳过他顺次取下一位。按照输入的顺序输出中奖名单,每个昵称占一行。如果没有人中奖,则输出“Keep going…”
分析:用mapp存储当前用户有没有已经中奖过~当输入的时候,判断当前字符串是否已经在mapp中出现过,如果出现过就将s+1。每次判断i是否等于s,如果等于s且当前用户没有中过奖,就将它的名字输出,并且s = s + n~并将mapp[str]标记为1,且flag标记为true表示有过人中奖。最后flag如果依然是false说明要输出Keep going…
Note: it is possible that someone would forward more than once, but no one can win more than once. 没得过奖,重复转发还是会提高中奖率。
1 | int main() { |
1126 Eulerian Path (25分)
题目大意:如果一个连通图的所有结点的度都是偶数,那么它就是Eulerian,如果除了两个结点的度是奇数其他都是偶数,那么它就是Semi-Eulerian,否则就是Non-Eulerian~
分析:用邻接表存储图,判断每个结点的度【也就是每个结点i的v[i].size()】是多少即可得到最终结果~注意:图必须是连通图,所以要用一个深搜判断一下连通性,从结点1开始深搜,如果最后发现统计的连通结点个数cnt != n说明是不是连通图,要输出Non-Eulerian~
1 | vector<vector<int> > v; |
1127 ZigZagging on a Tree (30分)
1128 N Queens Puzzle (20分)
题目大意:给出一个皇后图,以这样的方式给出:一个数组包含n个数字,每个数字表示该列的皇后所在的行数~判断给出的皇后图是否满足不会互相攻击(任意两个皇后都要不在同一行或者同一列,且不在斜对角线上~)
分析:用v[n]存储一张图给出的数字~对于第j个数字,判断前0~j-1个数字中是否有在同一行的(v[j] == v[t])和在斜对角线上的(abs(v[j]-v[t]) == abs(j-t))【因为已经告诉肯定不在同一列了,所以不需要判断是否在同一列啦~】如果发现了不满足的情况,就将result由true标记为false~最后根据result是true还是false输出对应的YES还是NO即可~
1 | int main() { |
1129 Recommendation System (25分)
题目大意:根据用户每次点击的东西的编号,输出他在点当前编号之前应该给这个用户推荐的商品的编号~只推荐k个~也就是输出用户曾经点击过的商品编号的最多的前k个~如果恰好两个商品有相同的点击次数,就输出编号较小的那个~
分析:【并不复杂~只是写的比较详细~不怕不怕~(摸头…】因为每个商品有两个属性:编号value和出现的次数cnt,编号具有唯一性,然后set又会根据大小自动排序,所以我们可以考虑将value和cnt组成一个node属性,把所有商品编号和它对应的次数变成node放入set里面,重载小于号,使<根据set中node的cnt排序,如果cnt相等就按照node的value排序~
这样set里面就是按照出现次数排序好的商品node,每次输出set的前k个node的value值就可以~(要记住,因为是点击前推荐,所以我们在接收完num的值后,应该先输出再插入让set帮忙排序当前num,当前的这个点击编号暂时先不算在输出结果里面的~)
首先在struct node里面重载<号,如果当前cnt不等于a.cnt就将cnt大的排在前,否则将value小的排在前面~
每次输入的时候,先不插入,先输出,当i != 0时候开始输出,因为i==0时候用户才第一次点击,没有可以推荐的~(沮丧脸…) 输出的同时记录输出过的个数tempCnt,当tempCnt < k的时候输出,因为只要前k个~所以就从头到尾依次输出set中的值就可以啦~
book[num]标记num出现的次数,每次寻找set中当前值为num和次数为book[num]的那个值,如果找到了就把他移除,(找到说明这个数已经出现过啦,cnt已经不对啦,先移除掉吧~)然后将book[num]+1,在将node(num, book[num])插入到set中,set会帮忙根据我们自定义的<的规则自动排序哒~
1 | int book[50001]; |