天梯赛练习(一)

L2-017. 人以群分

题意:

给定n个正整数,  然后分成规模相差尽可能接近的两类, 这两类之和相差要尽可能大

分析:

直接排序, 然后分成两部分即可

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[123456];
 4 int sum(int l , int r){
 5     int ans = 0;
 6     for(int i = l; i <= r; i++) ans += a[i];
 7     return ans;
 8 }
 9 int main()
10 {
11     int n;
12     scanf("%d", &n);
13     for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
14     sort(a + 1, a + n + 1);
15     int mid = n / 2;
16     printf("Outgoing #: %d\nIntroverted #: %d\nDiff = %d\n",n-mid, mid, sum(mid+1, n) - sum(1,mid));
17     return 0;
18 }

人以群分

L2-019. 悄悄关注

题意:

给定一个关注列表, 然后再给出一个对每个用户的点赞数, 如果有一个对某一个用户的点赞数大于平均值而且该用户不在关注列表中, 输出。

分析:

用一个set保存关注列表, 用一个map去储存用户点赞数, 最后遍历一次map即可。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 set<string> focus; //关注列表
 4 map<string, int > like; //点赞数
 5 int main()
 6 {
 7     int n, m;
 8     cin >> n;
 9     string temp;
10     for(int i = 0; i < n; i++){
11         cin >> temp;
12         focus.insert(temp);
13     }
14     double sum = 0;
15     int a;
16     cin >> m;
17     for(int i = 0; i < m; i++){
18         cin >> temp >> a;
19         like[temp] += a;
20         sum += a;
21     }
22     sum /= (double)m;
23     int flag = 0;
24     for(auto it = like.begin(); it != like.end(); it++){
25         if(it->second > sum && !focus.count(it->first)) {
26                 flag = 1;
27                 cout << it->first << "\n";
28         }
29     }
30     if(!flag) cout << "Bing Mei You\n";
31 }

悄悄关注

L2-020. 功夫传人

题意:

给定一个师傅徒弟家谱,每个师傅可以收很多个徒弟, 每个徒弟只能有一个师傅, 然后一开始有一个祖师爷有功力值Z。每代传递会有一个损耗r,徒弟有可能出现“得道者”会将功力放大k倍,但是“得道者”不会收徒弟,  求出“得道者”功力之和。

分析:

家谱成一个树形结构, 用BFS遍历一遍, 每次遇到“得道者”将功力加上即可。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 1e5 + 7;
 4 int n;
 5 double z, r;
 6 double quickpow(double a,int b)//快速幂
 7 {
 8     double ans = 1;
 9     while(b)//用一个循环从右到左便利b的所有二进制位
10     {
11         if(b&1)//判断此时b[i]的二进制位是否为1
12         {
13             ans = (ans*a);//乘到结果上,这里a是a^(2^i)%m
14             b--;//把该为变0
15         }
16         b/=2;
17         a = a*a;
18     }
19     return ans;
20 }
21 struct node{
22     int n, dynasty; //编号、 传递了几代
23     node(int _n, int _dynasty):n(_n), dynasty(_dynasty){}
24 };
25 int F[maxn], master[maxn];
26 vector<int> apprentice[maxn];
27 int main()
28 {
29     scanf("%d %lf %lf", &n, &z, &r);
30     r = (100 - r)/100;
31     for(int i = 0; i < n; i++){
32         int num;
33         scanf("%d", &num);
34         if(num == 0){
35             int t;
36             scanf("%d", &t);
37             master[i] = t;
38         }
39         else{
40             for(int j = 0; j < num; j++){
41                 int t;
42                 scanf("%d", &t);
43                 apprentice[i].push_back(t);
44             }
45         }
46     }
47     double ans = 0;
48     queue<node> q;
49     q.push(node(0,0));
50     while(!q.empty()){
51         node u = q.front(); q.pop();
52         int name = u.n , d = u.dynasty
53         if(master[name])
54         {
55             ans += quickpow(r,d) * z * (double)master[name];
56         }
57         else
58         for(int i = 0; i < apprentice[name].size(); i++){
59             q.push(node(apprentice[name][i], d + 1));
60         }
61     }
62     printf("%d\n", (int)ans);
63     return 0;
64 }

功夫传人

L3-013. 非常弹的球

题意:

给出一个球的质量, 求在一个平面抛出能得到的最远距离。

分析:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const double eps = 1e-6;
 4 int main()
 5 {
 6     double w, p, E, v, ans;
 7     scanf("%lf%lf", &w, &p);
 8     E = 1000, ans = 0;
 9     w /= 100;
10     do{
11         v = sqrt(2*E/w);
12         ans += v*v/9.8;
13         E *= ((100-p)/100);
14     }while(v > eps);
15     printf("%.3f", ans);
16 }

非常弹的球

L3-015. 球队“食物链”

题意:

给定N支队伍的2*N场双循环赛结果, 求出一条包含所有球队的“食物链”,“食物链”为一个1至N的排列{ T1 T2 ... TN },满足:球队T1战胜过球队T2,球队T2战胜过球队T3,……,球队T(N-1)战胜过球队TN,球队TN战胜过球队T1。若存在多条“食物链”,请找出字典序最小的。

分析:

因为这条食物链如果存在, 那么一定是包含所有球队的, 所以可以从第一个点开始DFS,有一个剪枝是“如果还没选择的点没有与1相连接的, 剪枝”。

另外要注意的是图并不是对称的, a输b==b赢a。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 bool g[25][25];
 4 bool vis[25];
 5 int pick[25];
 6 int n, ok;
 7 bool dfs(int index , int tot)
 8 {
 9     if(tot == n){
10         if(g[index][0] == 1){
11             printf("%d", pick[0] + 1);
12             for(int i = 1; i < n; i++) printf(" %d", pick[i] + 1); puts("");
13             return true;
14         }
15         return false;
16     }
17     int cut = 1;//剪枝, 如果剩下没挑选的点都没有与1相连的,剪枝。
18     for(int i = 0; i < n; i++){
19         if(!vis[i] && g[i][0] == 1) {
20             cut = 0;
21             break;
22         }
23     }
24     if(cut) return false;
25     for(int i = 0; i < n; i++){
26         if(g[index][i] == 1 && !vis[i]){
27             vis[i] = 1;
28             pick[tot] = i;
29             if(dfs(i, tot + 1)) return true;
30             vis[i] = 0;
31         }
32     }
33     return false;
34 }
35 int main()
36 {
37     scanf("%d ", &n);
38     char input[123];
39     for(int i = 0; i < n; i++){
40         gets(input);
41         for(int j = 0; j < n; j++)
42             if( input[j] == ‘W‘) g[i][j] = 1;
43             else if( input[j] == ‘L‘) g[j][i] = 1;//注意a输b其实等于b赢a
44     }
45     vis[0] = 1;
46     pick[0] = 0;
47     ok = dfs(0, 1);
48     if(!ok) printf("No Solution\n");
49 }

球队“食物链”

时间: 2024-10-28 15:43:33

天梯赛练习(一)的相关文章

PAT 团体程序设计天梯赛-练习集 题解(凑零钱,堆栈,社交集群)

开始准备cccc(cry)天梯赛了,第一周训练题,把官网挂出的训练题刷完了,对pat有了一点点的熟悉感. L1-1  就不说了... L1-2 打印沙漏 一个变量保存空格数,一个变量保存沙漏符号数,打印就行了,但这题话说wrong好几次啊,坑点是沙漏符号后面不打印空格,orz... <span style="font-size:14px;">#include<iostream> #include<stdio.h> #include<math.h

PAT 团体程序设计天梯赛-练习集L1-011. A-B

本题要求你计算A-B.不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A-B. 输入格式: 输入在2行中先后给出字符串A和B.两字符串的长度都不超过104,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束. 输出格式: 在一行中打印出A-B的结果字符串. 输入样例: I love GPLT! It's a fun game! aeiou 输出样例: I lv GPLT! It's fn gm! 1 #inclu

PAT 团体程序设计天梯赛-练习集 L1-015. 跟奥巴马一起画方块

美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形.现在你也跟他一起画吧! 输入格式: 输入在一行中给出正方形边长N(3<=N<=21)和组成正方形边的某种字符C,间隔一个空格. 输出格式: 输出由给定字符C画出的正方形.但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的50%(四舍五入取整). 输入样例

PAT 团体程序设计天梯赛-练习集 L1-007. 念数字

输入一个整数,输出每个数字对应的拼音.当整数为负数时,先输出“fu”字.十个数字对应的拼音如下: 0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8: ba 9: jiu 输入格式: 输入在一行中给出一个整数,如: 1234 . 提示:整数包括负数.零和正数. 输出格式: 在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格.如 yi er san si. 输入样例: -600 输出样例: fu liu ling

PAT 团体程序设计天梯赛-练习集 L1-005. 考试座位号

每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位.正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座.但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码. 输入格式: 输入第一行给出一个正整数N(<=1000),随后N行,每行给出一个考生的信息:“准考证号 试机座位号 考试座位号”.其中准考证号由14位数字组成,座位从1到N编号.输入保证每个

PAT 团体程序设计天梯赛-练习集 L1-016. 查验身份证

一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}:然后将计算的和对11取模得到值Z:最后按照以下关系对应Z值与校验码M的值: Z:0 1 2 3 4 5 6 7 8 9 10M:1 0 X 9 8 7 6 5 4 3 2 现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码. 输入格式: 输入第一行给出正整数N(<= 100

PAT 团体程序设计天梯赛-练习集 L1-017. 到底有多二

一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值.如果这个数是负数,则程度增加0.5倍:如果还是个偶数,则再增加1倍.例如数字“-13142223336”是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11*1.5*2*100%,约为81.82%.本题就请你计算一个给定整数到底有多二. 输入格式: 输入第一行给出一个不超过50位的整数N. 输出格式: 在一行中输出N犯二的程度,保留小数点后两位. 输入样例: -13142223336 输出样例: 81.8

天梯赛+蓝桥杯 总结

3月31天梯赛,4.1蓝桥杯.两个比赛接着好近,而且都是第一次参赛,有点小紧张的. 天梯赛个人打的一般般,凉凉了. 蓝桥杯的话就更凉了,感觉比以前的题目难多了. 先说天梯赛吧,比赛时好多人都出现了账号名字与真实姓名不同的情况下,或者登入不进去,还好我的登入成功了.由于这个问题比赛推迟了十分钟,还好没推迟很久. 进去后首先就看了第一题20分的,看了三分钟左右,还没有看懂题意,心理就感觉要凉了,第一题都还没看懂.之后才知道第一题是L1中最难的.... 还好卡了就没有继续钻牛角尖了,直接返回看分值最小

L1-049 天梯赛座位分配 (20 分)

这道题是我在参加天梯赛的时候出现的题,当时就没有做出来,然后就一直搁置了起来,前几天内部测试的时候又出现了,我还是没做出来,然后我就研究了一下,看了看别人的答案,才恍然大悟; 下面是题目: L1-049 天梯赛座位分配 (20 分) 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位参赛选手.令每校选手排成一列纵队,第 i+1 队的选手排在第 i

PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)

PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++:      欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/problem-sets/994805046380707840/problems 目录 (点击对应题目即可进入相应题解--小声BB--) L1-001 Hello World (5 分) L1-002 打印沙漏 (20 分) L1-003 个位数统计 (15 分) L1-004 计算摄氏温度 (5