襄阳网站制作公司有哪些lisp 网站开发
襄阳网站制作公司有哪些,lisp 网站开发,网站开发需要多少钱价格,wordpress近期评论L2-001. 紧急救援 作为一个城市的应急救援队伍的负责人#xff0c;你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候#xff0c;你…L2-001. 紧急救援 作为一个城市的应急救援队伍的负责人你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候你的任务是带领你的救援队尽快赶往事发地同时一路上召集尽可能多的救援队。 输入格式 输入第一行给出4个正整数N、M、S、D其中N2N500是城市的个数顺便假设城市的编号为0~(N-1)M是快速道路的条数S是出发地的城市编号D是目的地的城市编号。第二行给出N个正整数其中第i个数是第i个城市的救援队的数目数字间以空格分隔。随后的M行中每行给出一条快速道路的信息分别是城市1、城市2、快速道路的长度中间用空格分开数字均为整数且不超过500。输入保证救援可行且最优解唯一。 输出格式 第一行输出不同的最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到D的路径中经过的城市编号。数字间以空格分隔输出首尾不能有多余空格。 输入样例 4 5 0 3
20 30 40 10
0 1 1
1 3 2
0 3 3
0 2 2
2 3 2输出样例 2 60
0 1 3 1 //2017-03-172 #include iostream3 #include cstdio4 #include cstring5 #include queue6 #include stack7 8 using namespace std;9 10 const int N 510;11 const int inf 0x3f3f3f3f;12 int n, m, G[N][N], dis[N], vis[N], pre[N], way[N], maxpeo[N];13 14 int dijkstra(int s, int d)15 {16 for(int i 0; i n; i)17 {18 dis[i] G[s][i];19 if(G[s][i] ! inf){20 pre[i] s;21 way[i];22 }23 }24 pre[s] -1;25 dis[s] 0;26 vis[s] 1;27 way[s] 1;28 int mindis, u;29 maxpeo[s] G[s][s];30 for(int i 0; i n; i)31 {32 mindis inf;33 for(int j 0; j n; j)34 if(!vis[j] dis[j] mindis)35 {36 mindis dis[j];37 u j;38 }39 vis[u] 1;40 for(int v 0; v n; v)41 {42 if(vis[v] || G[u][v]inf)continue;43 if(dis[v] dis[u]G[u][v]){44 dis[v] dis[u]G[u][v];45 pre[v] u;46 maxpeo[v] maxpeo[u] G[v][v];47 way[v] way[u];48 }else if(dis[v] dis[u]G[u][v]){49 way[v] way[u];50 if(maxpeo[v] maxpeo[u]G[v][v]){51 maxpeo[v] maxpeo[u] G[v][v];52 pre[v] u;53 }54 }55 }56 }57 return maxpeo[d]maxpeo[s];58 }59 60 int main()61 {62 int s, d, u, v, w;63 while(cinnmsd)64 {65 for(int i 0; i n; i)66 {67 for(int j 0; j n; j)68 G[i][j] inf;69 vis[i] 0;70 dis[i] inf;71 pre[i] -1;72 way[i] 0;73 maxpeo[i] 0;74 cinG[i][i];75 maxpeo[i] G[i][i];76 }77 for(int i 0; i m; i)78 {79 cinuvw;80 G[u][v] G[v][u] w;81 }82 int peo dijkstra(s, d);83 int pr d;84 stackint sk;85 while(pr ! s)86 {87 sk.push(pr);88 pr pre[pr];89 }90 coutway[d] peoendl;91 couts;92 int o;93 while(!sk.empty())94 {95 o sk.top();96 cout o;97 sk.pop();98 }99 coutendl;
100 }
101
102 return 0;
103 } View Code L2-002. 链表去重 给定一个带整数键值的单链表L本题要求你编写程序删除那些键值的绝对值有重复的结点。即对任意键值K只有键值或其绝对值等于K的第一个结点可以被保留。同时所有被删除的结点必须被保存在另外一个链表中。例如另L为21→-15→-15→-7→15则你必须输出去重后的链表21→-15→-7、以及被删除的链表-15→15。 输入格式 输入第一行包含链表第一个结点的地址、以及结点个数N 105 的正整数。结点地址是一个非负的5位整数NULL指针用-1表示。 随后N行每行按下列格式给出一个结点的信息 Address Key Next 其中Address是结点的地址Key是绝对值不超过104的整数Next是下一个结点的地址。 输出格式 首先输出去重后的链表然后输出被删除结点组成的链表。每个结点占一行按输入的格式输出。 输入样例 00100 5
99999 -7 87654
23854 -15 00000
87654 15 -1
00000 -15 99999
00100 21 23854输出样例 00100 21 23854
23854 -15 99999
99999 -7 -1
00000 -15 87654
87654 15 -1 1 #include iostream2 #include cstdio3 #include cstring4 #include algorithm5 #include list6 7 using namespace std;8 9 const int N 1e610;
10 int ne[N], ke[N], book[10005];
11 struct node
12 {
13 int add, key, next;
14 void setNode(int a, int k, int n){
15 this-add a;
16 this-key k;
17 this-next n;
18 }
19 };
20
21 int main()
22 {
23 int s, n, pos;
24 while(cinsn)
25 {
26 int ad;
27 for(int i 0; i n; i)
28 {
29 cinad;
30 cinke[ad]ne[ad];
31 }
32 listnode l1, l2;
33 listnode::iterator it;
34 node tmp;
35 memset(book, 0, sizeof(book));
36 pos s;
37 book[abs(s)] 1;
38 tmp.setNode(pos, ke[pos], ne[pos]);
39 l1.push_back(tmp);
40 pos ne[pos];
41 while(pos ! -1)
42 {
43 if(book[abs(ke[pos])]){
44 if(!l2.empty()){
45 tmp l2.back();
46 tmp.next pos;
47 l2.pop_back();
48 l2.push_back(tmp);
49 }
50 tmp.setNode(pos, ke[pos], ne[pos]);
51 l2.push_back(tmp);
52 }else{
53 book[abs(ke[pos])] 1;
54 if(!l1.empty()){
55 tmp l1.back();
56 tmp.next pos;
57 l1.pop_back();
58 l1.push_back(tmp);
59 }
60 tmp.setNode(pos, ke[pos], ne[pos]);
61 l1.push_back(tmp);
62 }
63 pos ne[pos];
64 }
65 tmp l1.back(); tmp.next -1;
66 l1.pop_back();l1.push_back(tmp);
67 for(it l1.begin(); it ! l1.end(); it){
68 if(it-next -1)printf(%05d %d %d\n, it-add, it-key, it-next);
69 else printf(%05d %d %05d\n, it-add, it-key, it-next);
70 }
71 if(!l2.empty()){
72 tmp l2.back(); tmp.next -1;
73 l2.pop_back();l2.push_back(tmp);
74 }
75 for(it l2.begin(); it ! l2.end(); it){
76 if(it-next -1)printf(%05d %d %d\n, it-add, it-key, it-next);
77 else printf(%05d %d %05d\n, it-add, it-key, it-next);
78 }
79 }
80
81 return 0;
82 } View Code L2-003. 月饼 月饼是中国人在中秋佳节时吃的一种传统食品不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量请你计算可以获得的最大收益是多少。 注意销售时允许取出一部分库存。样例给出的情形是这样的假如我们有3种月饼其库存量分别为18、15、10万吨总售价分别为75、72、45亿元。如果市场的最大需求量只有20万吨那么我们最大收益策略应该是卖出全部15万吨第2种月饼、以及5万吨第3种月饼获得 72 45/2 94.5亿元。 输入格式 每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N表示月饼的种类数、以及不超过500以万吨为单位的正整数D表示市场最大需求量。随后一行给出N个正数表示每种月饼的库存量以万吨为单位最后一行给出N个正数表示每种月饼的总售价以亿元为单位。数字间以空格分隔。 输出格式 对每组测试用例在一行中输出最大收益以亿元为单位并精确到小数点后2位。 输入样例 3 20
18 15 10
75 72 45输出样例 94.501 //2017-03-182 #include iostream3 #include cstdio4 #include cstring5 #include algorithm6 7 using namespace std;8 9 const int N 1005;
10 struct node{
11 double a, b;
12 double c;
13 bool operator (const node x){
14 return c x.c;
15 }
16 }moom[N];
17
18 int main()
19 {
20 int n, need;
21 while(cinnneed)
22 {
23 for(int i 0; i n; i)
24 cinmoom[i].a;
25 for(int i 0; i n; i)
26 cinmoom[i].b;
27 for(int i 0; i n; i)
28 moom[i].c moom[i].b*1.0/moom[i].a;
29 sort(moom, moomn);
30 double ans 0;
31 for(int i 0; i n; i)
32 {
33 if(need moom[i].a){
34 ans moom[i].c*need;
35 break;
36 }else{
37 ans moom[i].b;
38 need - moom[i].a;
39 }
40 }
41 printf(%.2lf\n, ans);
42 }
43
44 return 0;
45 } View Code L2-004. 这是二叉搜索树吗 一棵二叉搜索树可被递归地定义为具有下列性质的二叉树对于任一结点 其左子树中所有结点的键值小于该结点的键值其右子树中所有结点的键值大于等于该结点的键值其左右子树都是二叉搜索树。所谓二叉搜索树的“镜像”即将所有结点的左右子树对换位置后所得到的树。 给定一个整数键值序列现请你编写程序判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。 输入格式 输入的第一行给出正整数N1000。随后一行给出N个整数键值其间以空格分隔。 输出格式 如果输入序列是对一棵二叉搜索树或其镜像进行前序遍历的结果则首先在一行中输出“YES”然后在下一行输出该树后序遍历的结果。数字间有1个空格一行的首尾不得有多余空格。若答案是否则输出“NO”。 输入样例1 7
8 6 5 7 10 8 11输出样例1 YES
5 7 6 8 11 10 8输入样例2 7
8 10 11 8 6 7 5输出样例2 YES
11 8 10 7 5 6 8输入样例3 7
8 6 8 5 10 9 11输出样例3 NO1 //2017-03-192 #include iostream3 #include cstdio4 #include cstring5 6 using namespace std;7 8 const int N 1005;9 int bt[N], bst1[N], bst2[N], ANS[N], n, cnt;10 struct node{11 int data;12 node *lson, *rson;13 node(int d):data(d), lson(NULL), rson(NULL){}14 };15 16 class BST17 {18 public:19 node *rt;20 BST():rt(NULL){}21 void insert(int a)22 {23 node* nd new node(a);24 if(rt NULL){25 rt nd;26 }else{27 node *p rt, *q NULL;28 while(p ! NULL){29 q p;30 if(a p-data){31 p p-lson;32 }else{33 p p-rson;34 }35 }36 if(a q-data)q-lson nd;37 else q-rson nd;38 }39 }40 };41 42 void preOrder1(node* id)43 {44 if(id ! NULL)45 {46 bst1[cnt] id-data;47 cnt;48 preOrder1(id-lson);49 preOrder1(id-rson);50 }51 }52 53 void preOrder2(node* id)54 {55 if(id ! NULL)56 {57 bst2[cnt] id-data;58 cnt;59 preOrder2(id-rson);60 preOrder2(id-lson);61 }62 }63 64 void postOrder1(node* id)65 {66 if(id ! NULL){67 postOrder1(id-lson);68 postOrder1(id-rson);69 ANS[cnt] id-data;70 cnt;71 }72 }73 74 void postOrder2(node* id)75 {76 if(id ! NULL){77 postOrder2(id-rson);78 postOrder2(id-lson);79 ANS[cnt] id-data;80 cnt;81 }82 }83 84 int main()85 {86 while(cinn)87 {88 BST bst;89 for(int i 0; i n; i)90 {91 cinbt[i];92 bst.insert(bt[i]);93 }94 cnt 0;95 preOrder1(bst.rt);96 cnt 0;97 preOrder2(bst.rt);98 bool fg1 true, fg2 true;99 for(int i 0; i n; i){
100 if(bt[i] ! bst1[i])fg1 false;
101 if(bt[i] ! bst2[i])fg2 false;
102 }
103 if(fg1){
104 coutYESendl;
105 cnt 0;
106 postOrder1(bst.rt);
107 for(int i 0; i n; i)
108 if(i n-1)coutANS[i]endl;
109 else coutANS[i] ;
110 }else if(fg2){
111 coutYESendl;
112 cnt 0;
113 postOrder2(bst.rt);
114 for(int i 0; i n; i)
115 if(i n-1)coutANS[i]endl;
116 else coutANS[i] ;
117 }else coutNOendl;
118 }
119
120 return 0;
121 } View Code L2-005. 集合相似度 给定两个整数集合它们的相似度定义为Nc/Nt*100%。其中Nc是两个集合都有的不相等整数的个数Nt是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。 输入格式 输入第一行给出一个正整数N50是集合的个数。随后N行每行对应一个集合。每个集合首先给出一个正整数M104是集合中元素的个数然后跟M个[0, 109]区间内的整数。 之后一行给出一个正整数K2000随后K行每行对应一对需要计算相似度的集合的编号集合从1到N编号。数字间以空格分隔。 输出格式 对每一对需要计算的集合在一行中输出它们的相似度为保留小数点后2位的百分比数字。 输入样例 3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3输出样例 50.00%
33.33%1 //2017-03-192 #include iostream3 #include cstdio4 #include cstring5 #include algorithm6 #include set7 8 using namespace std;9
10 int se[55][1005], cnt[55];
11
12 double merge(int a, int b)
13 {
14 int nt 0, nc 0;
15 int cnt1 0, cnt2 0;
16 while(cnt1 cnt[a] cnt2 cnt[b])
17 {
18 if(se[a][cnt1] se[b][cnt2]){
19 nt;
20 cnt1;
21 }else if(se[a][cnt1] se[b][cnt2]){
22 nt;
23 cnt2;
24 }else{
25 nt;
26 nc;
27 cnt1;
28 cnt2;
29 }
30 }
31 if(cnt1cnt[a])nt cnt[a]-cnt1;
32 if(cnt2cnt[b])nt cnt[b]-cnt2;
33 return nc*1.0/nt;
34 }
35
36 int main()
37 {
38 int n, m, a;
39 while(cinn)
40 {
41 memset(cnt, 0, sizeof(cnt));
42 for(int i 1; i n; i)
43 {
44 cinm;
45 setint S;
46 setint::iterator it;
47 for(int j 0; j m; j)
48 {
49 cina;
50 it S.find(a);
51 if(it S.end()){
52 S.insert(a);
53 se[i][cnt[i]] a;
54 cnt[i];
55 }
56 }
57 sort(se[i], se[i]cnt[i]);
58 }
59 cinm;
60 int s1, s2;
61 while(m--)
62 {
63 cins1s2;
64 double ans merge(s1, s2)*100;
65 printf(%.2lf%\n, ans);
66 }
67 }
68
69 return 0;
70 } View Code L2-006. 树的遍历 给定一棵二叉树的后序遍历和中序遍历请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式 输入第一行给出一个正整数N30是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。 输出格式 在一行中输出该树的层序遍历的序列。数字间以1个空格分隔行首尾不得有多余空格。 输入样例 7
2 3 1 5 7 6 4
1 2 3 4 5 6 7输出样例 4 1 6 3 5 7 2 1 //2017-03-202 #include iostream3 #include cstdio4 #include cstring5 #include queue6 7 using namespace std;8 9 int post[35], in[35], ANS[35];
10 struct node{
11 int data;
12 node *lson, *rson;
13 node(int d):data(d), lson(NULL), rson(NULL){}
14 };
15
16 struct BT{
17 node *root;
18 void rebuild(int n)
19 {
20 root buildTree(post, in, n);
21 }
22 node* buildTree(int *post, int *in, int n)
23 {
24 if(n 1)return NULL;
25 node *rt new node(post[n-1]);
26 if(n 1)return rt;
27 int R;
28 for(int i 0; i n; i)
29 {
30 if(in[i] post[n-1]){
31 R i;
32 break;
33 }
34 }
35 rt-lson buildTree(post, in, R);
36 rt-rson buildTree(postR, inR1, n-R-1);
37 return rt;
38 }
39 void levelOrder()
40 {
41 queuenode* q;
42 q.push(root);
43 node *h;
44 int cnt 0;
45 while(!q.empty()){
46 h q.front();
47 q.pop();
48 ANS[cnt] h-data;
49 if(h-lson)q.push(h-lson);
50 if(h-rson)q.push(h-rson);
51 }
52 for(int i 0; i cnt; i)
53 if(i cnt-1)coutANS[i]endl;
54 else coutANS[i] ;
55 }
56 };
57
58 int main()
59 {
60 int n;
61 while(cinn)
62 {
63 for(int i 0; i n; i)
64 cinpost[i];
65 for(int i 0; i n; i)
66 cinin[i];
67 BT bt;
68 bt.rebuild(n);
69 bt.levelOrder();
70 }
71
72 return 0;
73 } View Code L2-008. 最长对称子串 对给定的字符串本题要求你输出最长对称子串的长度。例如给定Is PATTAP symmetric?最长对称子串为s PATTAP s于是你应该输出11。 输入格式 输入在一行中给出长度不超过1000的非空字符串。 输出格式 在一行中输出最长对称子串的长度。 输入样例 Is PATTAP symmetric?输出样例 111 //2017-03-192 #include iostream3 #include cstdio4 #include cstring5 6 using namespace std;7 8 string str;9 int len;
10
11 int search(int pos)
12 {
13 int l, r, ans 1;
14 l pos-1;
15 r pos1;
16 while(l 0 r len)
17 {
18 if(str[l] str[r])
19 {
20 ans2;
21 l--;
22 r;
23 }else break;
24 }
25 return ans;
26 }
27
28 int search2(int pos)
29 {
30 int l, r, ans 0;
31 l pos;
32 r pos1;
33 while(l 0 r len)
34 {
35 if(str[l] str[r])
36 {
37 ans2;
38 l--;
39 r;
40 }else break;
41 }
42 return ans;
43 }
44
45 int main()
46 {
47 while(getline(cin, str))
48 {
49 len str.length();
50 int ans 0, tmp;
51 for(int i 0; i len; i)
52 {
53 tmp search(i);
54 if(tmpans)ans tmp;
55 tmp search2(i);
56 if(tmpans)ans tmp;
57 }
58 coutansendl;
59 }
60
61 return 0;
62 } View Code L2-009. 抢红包 没有人没抢过红包吧…… 这里给出N个人之间互相发红包、抢红包的记录请你统计一下他们抢红包的收获。 输入格式 输入第一行给出一个正整数N 104即参与发红包和抢红包的总人数则这些人从1到N编号。随后N行第i行给出编号为i的人发红包的记录格式如下 K N1 P1 ... NK PK 其中K0 K 20是发出去的红包个数Ni是抢到红包的人的编号Pi 0是其抢到的红包金额以分为单位。注意对于同一个人发出的红包每人最多只能抢1次不能重复抢。 输出格式 按照收入金额从高到低的递减顺序输出每个人的编号和收入金额以元为单位输出小数点后2位。每个人的信息占一行两数字间有1个空格。如果收入金额有并列则按抢到红包的个数递减输出如果还有并列则按个人编号递增输出。 输入样例 10
3 2 22 10 58 8 125
5 1 345 3 211 5 233 7 13 8 101
1 7 8800
2 1 1000 2 1000
2 4 250 10 320
6 5 11 9 22 8 33 7 44 10 55 4 2
1 3 8800
2 1 23 2 123
1 8 250
4 2 121 4 516 7 112 9 10输出样例 1 11.63
2 3.63
8 3.63
3 2.11
7 1.69
6 -1.67
9 -2.18
10 -3.26
5 -3.26
4 -12.321 //2017-03-192 #include iostream3 #include cstdio4 #include cstring5 #include algorithm6 7 using namespace std;8 9 const int N 10010;
10 struct node{
11 int id, cnt;
12 double out, in;
13 double fin;
14 bool operator (node x)
15 {
16 if(fin x.fin)return cnt x.cnt;
17 return fin x.fin;
18 }
19 }man[N];
20
21 int main()
22 {
23 int n, k;
24 while(cinn)
25 {
26 for(int i 1; i n; i)
27 {
28 man[i].in 0;
29 man[i].out 0;
30 man[i].cnt 0;
31 }
32 for(int i 1; i n; i)
33 {
34 man[i].id i;
35 cink;
36 int id, monky;
37 while(k--)
38 {
39 cinidmonky;
40 man[id].in monky;
41 man[i].out monky;
42 man[id].cnt;
43 }
44 }
45 for(int i 1; i n; i)
46 man[i].fin (man[i].in-man[i].out)/100;
47 sort(man1, mann1);
48 for(int i 1; i n; i)
49 printf(%d %.2lf\n, man[i].id, man[i].fin);
50 }
51
52 return 0;
53 } View Code L2-010. 排座位 布置宴席最微妙的事情就是给前来参宴的各位宾客安排座位。无论如何总不能把两个死对头排到同一张宴会桌旁这个艰巨任务现在就交给你对任何一对客人请编写程序告诉主人他们是否能被安排同席。 输入格式 输入第一行给出3个正整数N 100即前来参宴的宾客总人数则这些人从1到N编号M为已知两两宾客之间的关系数K为查询的条数。随后M行每行给出一对宾客之间的关系格式为“宾客1 宾客2 关系”其中“关系”为1表示是朋友-1表示是死对头。注意两个人不可能既是朋友又是敌人。最后K行每行给出一对需要查询的宾客编号。 这里假设朋友的朋友也是朋友。但敌人的敌人并不一定就是朋友朋友的敌人也不一定是敌人。只有单纯直接的敌对关系才是绝对不能同席的。 输出格式 对每个查询输出一行结果如果两位宾客之间是朋友且没有敌对关系则输出“No problem”如果他们之间并不是朋友但也不敌对则输出“OK”如果他们之间有敌对然而也有共同的朋友则输出“OK but...”如果他们之间只有敌对关系则输出“No way”。 输入样例 7 8 4
5 6 1
2 7 -1
1 3 1
3 4 1
6 7 -1
1 2 1
1 4 1
2 3 -1
3 4
5 7
2 3
7 2输出样例 No problem
OK
OK but...
No way1 #include iostream2 #include cstdio3 #include cstring4 5 using namespace std;6 7 int G[105][105];8 int n;9
10 void query(int a, int b)
11 {
12 if(G[a][b] 0){
13 for(int i 1; i n; i)
14 if(G[a][i] 1 G[b][i] 1){
15 coutNo problemendl;
16 return;
17 }
18 coutOKendl;
19 }else if(G[a][b] 1){
20 for(int i 1; i n; i)
21 if(G[a][i] -1 G[b][i] -1)
22 return;
23 coutNo problemendl;
24 }else if(G[a][b] -1){
25 for(int i 1; i n; i)
26 if(G[a][i] 1 G[b][i] 1){
27 coutOK but...endl;
28 return;
29 }
30 coutNo wayendl;
31 }
32 }
33
34 int main()
35 {
36 int m, q, u, v, re;
37 while(cinnmq)
38 {
39 memset(G, 0, sizeof(G));
40 for(int i 0; i m; i)
41 {
42 cinuvre;
43 G[u][v] G[v][u] re;
44 }
45 while(q--)
46 {
47 cinuv;
48 query(u, v);
49 }
50 }
51
52 return 0;
53 } View Code L2-011. 玩转二叉树 给定一棵二叉树的中序遍历和前序遍历请你先将树做个镜面反转再输出反转后的层序遍历的序列。所谓镜面反转是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。 输入格式 输入第一行给出一个正整数N30是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。 输出格式 在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔行首尾不得有多余空格。 输入样例 7
1 2 3 4 5 6 7
4 1 3 2 6 5 7输出样例 4 6 1 7 5 3 21 //2017-03-202 #include iostream3 #include cstdio4 #include cstring5 #include queue6 7 using namespace std;8 9 int pre[35], in[35], ANS[35];
10 struct node{
11 int data;
12 node *lson, *rson;
13 node(int d):data(d), lson(NULL), rson(NULL){}
14 };
15
16 struct BT{
17 node *root;
18 void rebuild(int n)
19 {
20 root buildTree(pre, in, n);
21 }
22 node* buildTree(int *pre, int *in, int n)
23 {
24 if(n 1)return NULL;
25 node *rt new node(pre[0]);
26 if(n 1)return rt;
27 int R;
28 for(int i 0; i n; i)
29 {
30 if(in[i] pre[0]){
31 R i;
32 break;
33 }
34 }
35 rt-lson buildTree(pre1, in, R);
36 rt-rson buildTree(pre1R, inR1, n-R-1);
37 return rt;
38 }
39 void levelOrder()
40 {
41 queuenode* q;
42 q.push(root);
43 node *h;
44 int cnt 0;
45 while(!q.empty()){
46 h q.front();
47 q.pop();
48 ANS[cnt] h-data;
49 if(h-rson)q.push(h-rson);
50 if(h-lson)q.push(h-lson);
51 }
52 for(int i 0; i cnt; i)
53 if(i cnt-1)coutANS[i]endl;
54 else coutANS[i] ;
55 }
56 };
57
58 int main()
59 {
60 int n;
61 while(cinn)
62 {
63 for(int i 0; i n; i)
64 cinin[i];
65 for(int i 0; i n; i)
66 cinpre[i];
67 BT bt;
68 bt.rebuild(n);
69 bt.levelOrder();
70 }
71
72 return 0;
73 } View Code L2-012. 关于堆的判断 将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种 “x is the root”x是根结点“x and y are siblings”x和y是兄弟结点“x is the parent of y”x是y的父结点“x is a child of y”x是y的一个子结点。输入格式 每组测试第1行包含2个正整数N 1000和M 20分别是插入元素的个数、以及需要判断的命题数。下一行给出区间[-10000, 10000]内的N个要被插入一个初始为空的小顶堆的整数。之后M行每行给出一个命题。题目保证命题中的结点键值都是存在的。 输出格式 对输入的每个命题如果其为真则在一行中输出“T”否则输出“F”。 输入样例 5 4
46 23 26 24 10
24 is the root
26 and 23 are siblings
46 is the parent of 23
23 is a child of 10输出样例 F
T
F
T1 //2017-03-202 #include iostream3 #include cstdio4 #include cstring5 6 using namespace std;7 8 struct Heap{9 int h[1010];10 int n;11 void init()12 {13 n 0;14 }15 void shiftup(int pos)16 {17 int fa, tmp;18 while(pos 0){19 fa (pos-1)/2;20 if(h[fa]h[pos]){21 tmp h[pos];22 h[pos] h[fa];23 h[fa] tmp;24 pos fa;25 }else break;26 }27 }28 void addNode(int x)29 {30 h[n] x;31 shiftup(n-1);32 }33 void show(){34 for(int i 0; i n; i)35 couth[i] ;36 coutendl;37 }38 };39 40 int main()41 {42 int n,m;43 while(cinnm)44 {45 Heap heap;46 heap.init();47 int a;48 for(int i 0; i n; i)49 {50 cina;51 heap.addNode(a);52 }53 int x, y;54 string s1, s2, s3, s4;55 while(m--)56 {57 cinx;58 cins1;59 if(s1[0] a){60 cinys2s3;61 int p1, p2;62 for(int i 0; i heap.n; i)63 {64 if(heap.h[i] x)p1 i;65 if(heap.h[i] y)p2 i;66 }67 if((p1-1)/2 (p2-1)/2)coutTendl;68 else coutFendl;69 }else{70 cins2;71 if(s2[0] a){72 cins3s4y;73 int p1, p2;74 for(int i 0; i heap.n; i)75 {76 if(heap.h[i] x)p1 i;77 if(heap.h[i] y)p2 i;78 }79 if((p1-1)/2 p2)coutTendl;80 else coutFendl; 81 }else{82 cins3;83 if(s3[0] r){84 if(heap.h[0] x)coutTendl;85 else coutFendl;86 }else{87 cins4y;88 int p1, p2;89 for(int i 0; i heap.n; i){90 if(heap.h[i] x)p1 i;91 if(heap.h[i] y)p2 i;92 }93 if((p2-1)/2 p1)coutTendl;94 else coutFendl;95 }96 }97 }98 }99 }
100
101 return 0;
102 } View Code L2-017. 人以群分 社交网络中我们给每个人定义了一个“活跃度”现希望根据这个指标把人群分为两大类即外向型outgoing即活跃度高的和内向型introverted即活跃度低的。要求两类人群的规模尽可能接近而他们的总活跃度差距尽可能拉开。 输入格式 输入第一行给出一个正整数N2 N 105。随后一行给出N个正整数分别是每个人的活跃度其间以空格分隔。题目保证这些数字以及它们的和都不会超过231。 输出格式 按下列格式输出 Outgoing #: N1
Introverted #: N2
Diff N3其中 N1 是外向型人的个数N2 是内向型人的个数N3 是两群人总活跃度之差的绝对值。 输入样例1 10
23 8 10 99 46 2333 46 1 666 555输出样例1 Outgoing #: 5
Introverted #: 5
Diff 3611输入样例2 13
110 79 218 69 3721 100 29 135 2 6 13 5188 85输出样例2 Outgoing #: 7
Introverted #: 6
Diff 9359 1 //2018-03-142 #include cstdio3 #include cstring4 #include iostream5 #include algorithm6 7 using namespace std;8 9 const int N 100005;
10 int arr[N];
11
12 int main()
13 {
14 int n;
15 while(~scanf(%d, n)){
16 for(int i 0; i n; i)
17 scanf(%d, arr[i]);
18 sort(arr, arrn);
19 int in n/2;
20 int sumIn 0, sumOut 0;
21 for(int i 0; i n; i){
22 if(i in) sumIn arr[i];
23 else sumOut arr[i];
24 }
25 printf(Outgoing #: %d\nIntroverted #: %d\nDiff %d\n, n-in, in, sumOut-sumIn);
26 }
27
28 return 0;
29 } View Code L2-019. 悄悄关注 新浪微博上有个“悄悄关注”一个用户悄悄关注的人不出现在这个用户的关注列表上但系统会推送其悄悄关注的人发表的微博给该用户。现在我们来做一回网络侦探根据某人的关注列表和其对其他用户的点赞情况扒出有可能被其悄悄关注的人。 输入格式 输入首先在第一行给出某用户的关注列表格式如下 人数N 用户1 用户2 …… 用户N 其中N是不超过5000的正整数每个“用户i”i1, ..., N是被其关注的用户的ID是长度为4位的由数字和英文字母组成的字符串各项间以空格分隔。 之后给出该用户点赞的信息首先给出一个不超过10000的正整数M随后M行每行给出一个被其点赞的用户ID和对该用户的点赞次数不超过1000以空格分隔。注意用户ID是一个用户的唯一身份标识。题目保证在关注列表中没有重复用户在点赞信息中也没有重复用户。 输出格式 我们认为被该用户点赞次数大于其点赞平均数、且不在其关注列表上的人很可能是其悄悄关注的人。根据这个假设请你按用户ID字母序的升序输出可能是其悄悄关注的人每行1个ID。如果其实并没有这样的人则输出“Bing Mei You”。 输入样例1 10 GAO3 Magi Zha1 Sen1 Quan FaMK LSum Eins FatM LLao
8
Magi 50
Pota 30
LLao 3
Ammy 48
Dave 15
GAO3 31
Zoro 1
Cath 60输出样例1 Ammy
Cath
Pota输入样例2 11 GAO3 Magi Zha1 Sen1 Quan FaMK LSum Eins FatM LLao Pota
7
Magi 50
Pota 30
LLao 48
Ammy 3
Dave 15
GAO3 31
Zoro 29输出样例2 Bing Mei You 1 //2018-03-142 #include cstdio3 #include cstring4 #include iostream5 #include algorithm6 #include set7 8 using namespace std;9
10 const int N 5005;
11
12 string strs[2*N];
13 int arr[2*N];
14 setstring st, ans_st;
15
16 int main()
17 {
18 int n, m;
19 while(cinn){
20 string str;
21 st.clear();
22 for(int i 0; i n; i){
23 cinstr;
24 st.insert(str);
25 }
26 cinm;
27 int sum 0;
28 for(int i 0; i m; i){
29 cinstrs[i]arr[i];
30 sum arr[i];
31 }
32 double avg 1.0*sum/m;
33 setstring::iterator iter;
34 ans_st.clear();
35 for(int i 0; i m; i){
36 if((iter st.find(strs[i])) st.end() arr[i] avg){
37 ans_st.insert(strs[i]);
38 }
39 }
40 if(ans_st.empty()){
41 coutBing Mei Youendl;
42 }else{
43 for(auto x: ans_st){
44 coutxendl;
45 }
46 }
47 }
48
49 return 0;
50 } View Code L2-020. 功夫传人 一门武功能否传承久远并被发扬光大是要看缘分的。一般来说师傅传授给徒弟的武功总要打个折扣于是越往后传弟子们的功夫就越弱…… 直到某一支的某一代突然出现一个天分特别高的弟子或者是吃到了灵丹、挖到了特别的秘笈会将功夫的威力一下子放大N倍 —— 我们称这种弟子为“得道者”。 这里我们来考察某一位祖师爷门下的徒子徒孙家谱假设家谱中的每个人只有1位师傅除了祖师爷没有师傅每位师傅可以带很多徒弟并且假设辈分严格有序即祖师爷这门武功的每个第i代传人只能在第i-1代传人中拜1个师傅。我们假设已知祖师爷的功力值为Z每向下传承一代就会减弱r%除非某一代弟子得道。现给出师门谱系关系要求你算出所有得道者的功力总值。 输入格式 输入在第一行给出3个正整数分别是N105——整个师门的总人数于是每个人从0到N-1编号祖师爷的编号为0Z——祖师爷的功力值不一定是整数但起码是正数r ——每传一代功夫所打的折扣百分比值不超过100的正数。接下来有N行第i行i0, ..., N-1描述编号为i的人所传的徒弟格式为 Ki ID[1] ID[2] ... ID[Ki] 其中Ki是徒弟的个数后面跟的是各位徒弟的编号数字间以空格间隔。Ki为零表示这是一位得道者这时后面跟的一个数字表示其武功被放大的倍数。 输出格式 在一行中输出所有得道者的功力总值只保留其整数部分。题目保证输入和正确的输出都不超过1010。 输入样例 10 18.0 1.00
3 2 3 5
1 9
1 4
1 7
0 7
2 6 1
1 8
0 9
0 4
0 3输出样例 404 1 //2018-03-152 #include cstdio3 #include cstring4 #include iostream5 #include algorithm6 #include cmath7 8 using namespace std;9
10 const int N 100005;
11 int fa[N], dd_id[N], dd_bs[N], depth[N];
12
13 int getDepth(int x){
14 if(fa[x] x)return 0;
15 if(depth[x])return depth[x];
16 return depth[x] getDepth(fa[x])1;
17 }
18
19 int main()
20 {
21 int n, k;
22 double Z, r;
23 while(cinnZr){
24 r (100-r)/100;
25 int cnt 0, tmp;
26 memset(depth, 0, sizeof(depth));
27 for(int i 0; i n; i)
28 fa[i] i;
29 for(int i 0; i n; i){
30 cin k;
31 if(!k){
32 cintmp;
33 dd_id[cnt] i;
34 dd_bs[cnt] tmp;
35 }else{
36 while(k--){
37 cintmp;
38 fa[tmp] i;
39 }
40 }
41 }
42 double sum 0;
43 for(int i 0; i cnt; i){
44 double dsum Z*dd_bs[i];
45 int dp getDepth(dd_id[i]);
46 dsum * pow(r, dp);
47 sum dsum;
48 }
49 cout(int)sumendl;
50 }
51
52 return 0;
53 } View Code L2-021. 点赞狂魔 微博上有个“点赞”功能你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签而你点赞的博文的类型也间接刻画了你的特性。然而有这么一种人他们会通过给自己看到的一切内容点赞来狂刷存在感这种人就被称为“点赞狂魔”。他们点赞的标签非常分散无法体现出明显的特性。本题就要求你写个程序通过统计每个人点赞的不同标签的数量找出前3名点赞狂魔。 输入格式 输入在第一行给出一个正整数N100是待统计的用户数。随后N行每行列出一位用户的点赞标签。格式为“Name K F1 ... FK”其中 Name 是不超过8个英文小写字母的非空用户名1K1000Fii1, ..., K是特性标签的编号我们将所有特性标签从1到107编号。数字间以空格分隔。 输出格式 统计每个人点赞的不同标签的数量找出数量最大的前3名在一行中顺序输出他们的用户名,其间以1个空格分隔,且行末不得有多余空格。如果有并列则输出标签出现次数平均值最小的那个题目保证这样的用户没有并列。若不足3人则用“-”补齐缺失例如“mike jenny -”就表示只有2人。 输入样例 5
bob 11 101 102 103 104 105 106 107 108 108 107 107
peter 8 1 2 3 4 3 2 5 1
chris 12 1 2 3 4 5 6 7 8 9 1 2 3
john 10 8 7 6 5 4 3 2 1 7 5
jack 9 6 7 8 9 10 11 12 13 14输出样例 jack chris john1 //2018-03-152 #include cstdio3 #include cstring4 #include iostream5 #include algorithm6 7 using namespace std;8 9 const int N 110;
10
11 struct Node{
12 string name;
13 int len, uniLen;
14
15 bool operator(Node node){
16 if(uniLen node.uniLen)
17 return len node.len;
18 return uniLen node.uniLen;
19 }
20 }person[N];
21
22 int arr[1010];
23
24 int main()
25 {
26 int n;
27 while(cin n){
28 string str;
29 for(int i 0; i n; i){
30 cinperson[i].nameperson[i].len;
31 for(int j 0; j person[i].len; j)
32 scanf(%d, arr[j]);
33 sort(arr, arrperson[i].len);
34 int cnt unique(arr, arrperson[i].len) - arr;
35 person[i].uniLen cnt;
36 }
37 sort(person, personn);
38 if(n 0)cout- - -endl;
39 else if(n 1)coutperson[0].name - -endl;
40 else if(n 2)coutperson[0].name person[1].name -endl;
41 else coutperson[0].name person[1].name person[2].nameendl;
42 }
43
44 return 0;
45 } View Code L3-001. 凑零钱 韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里发现这家店有个特别的规矩你可以用任何星球的硬币付钱但是绝不找零当然也不能欠债。韩梅梅手边有104枚来自各个星球的硬币需要请你帮她盘算一下是否可能精确凑出要付的款额。 输入格式 输入第一行给出两个正整数N104是硬币的总个数M102是韩梅梅要付的款额。第二行给出N枚硬币的正整数面值。数字间以空格分隔。 输出格式 在一行中输出硬币的面值 V1 V2 ... Vk满足条件 V1 V2 ... Vk M。数字间以1个空格分隔行首尾不得有多余空格。若解不唯一则输出最小序列。若无解则输出“No Solution”。 注我们说序列{A[1], A[2], ...}比{B[1], B[2], ...}“小”是指存在 k 1 使得 A[i]B[i] 对所有 i k 成立并且 A[k] B[k]。 输入样例1 8 9
5 9 8 7 2 3 4 1输出样例1 1 3 5输入样例2 4 8
7 2 4 3输出样例2 No Solution 1 //2018-03-152 #include iostream3 #include cstdio4 #include cstring5 #include algorithm6 7 using namespace std;8 9 const int N 10010;
10 int arr[N], book[N], suffix_sum[N];//后缀和
11 int n, m;
12 bool ok;
13
14 void dfs(int step, int money){
15 //剪枝
16 if(step n || ok || money m || moneysuffix_sum[step] m)return;
17 if(money m){
18 ok true;
19 bool first true;
20 for(int i 0; i n; i){
21 if(book[i]){
22 if(first){
23 printf(%d, arr[i]);
24 first false;
25 }else{
26 printf( %d, arr[i]);
27 }
28 }
29 }
30 printf(\n);
31 }
32 book[step] 1;
33 dfs(step1, moneyarr[step]);
34 book[step] 0;
35 dfs(step1, money);
36 }
37
38 int main()
39 {
40 while(~scanf(%d%d, n, m))
41 {
42 for(int i 0; i n; i)
43 scanf(%d, arr[i]);
44 sort(arr, arrn);
45 suffix_sum[n] 0;
46 for(int i n-1; i 0; i--)
47 suffix_sum[i] suffix_sum[i1]arr[i];
48 ok false;
49 memset(book, 0, sizeof(book));
50 dfs(0, 0);
51 if(!ok)printf(No Solution\n);
52 }
53
54 return 0;
55 } View Code 转载于:https://www.cnblogs.com/Penn000/p/6568905.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/90144.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!