🚀欢迎来到本文🚀
🍉个人简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的普通人。
🏀个人主页:@陈童学哦`CSDN
💡所属专栏:PTA
🎁希望各位→点赞👍 + 收藏⭐️ + 留言📝
⛱️刷题的当下应是享受的!望与诸君共勉!🏄♂️
下面是PTA的OJ平台
PTA的OJ平台(点击我直跳)
题目汇总
- 题解
- L2-027 名人堂与代金券
- L2-028 秀恩爱分得快
- L2-029 特立独行的幸福
- 写在最后
题解
L2-027 名人堂与代金券
对于在中国大学MOOC(http://www.icourse163.org/ )学习“数据结构”课程的学生,想要获得一张合格证书,总评成绩必须达到 60 分及以上,并且有另加福利:总评分在 [G, 100] 区间内者,可以得到 50 元 PAT 代金券;在 [60, G) 区间内者,可以得到 20 元PAT代金券。全国考点通用,一年有效。同时任课老师还会把总评成绩前 K 名的学生列入课程“名人堂”。本题就请你编写程序,帮助老师列出名人堂的学生,并统计一共发出了面值多少元的 PAT 代金券。
输入格式:
输入在第一行给出 3 个整数,分别是 N(不超过 10 000 的正整数,为学生总数)、G(在 (60,100) 区间内的整数,为题面中描述的代金券等级分界线)、K(不超过 100 且不超过 N 的正整数,为进入名人堂的最低名次)。接下来 N 行,每行给出一位学生的账号(长度不超过15位、不带空格的字符串)和总评成绩(区间 [0, 100] 内的整数),其间以空格分隔。题目保证没有重复的账号。
输出格式:
首先在一行中输出发出的 PAT 代金券的总面值。然后按总评成绩非升序输出进入名人堂的学生的名次、账号和成绩,其间以 1 个空格分隔。需要注意的是:成绩相同的学生享有并列的排名,排名并列时,按账号的字母序升序输出。
输入样例:
10 80 5
cy@zju.edu.cn 78
cy@pat-edu.com 87
1001@qq.com 65
uh-oh@163.com 96
test@126.com 39
anyone@qq.com 87
zoe@mit.edu 80
jack@ucla.edu 88
bob@cmu.edu 80
ken@163.com 70
输出样例:
360
1 uh-oh@163.com 96
2 jack@ucla.edu 88
3 anyone@qq.com 87
3 cy@pat-edu.com 87
5 bob@cmu.edu 80
5 zoe@mit.edu 80
AC代码:
#include<bits/stdc++.h>
using namespace std;
struct node
{
string name;
int cj;
}stu[10001];
bool cmp(node a,node b)
{
if(a.cj==b.cj)
return a.name<b.name;
return a.cj>b.cj;
}
int main()
{
int n,g,k;
int money=0;
scanf("%d %d %d",&n,&g,&k);
for(int i=0;i<n;i++)
{
cin>>stu[i].name>>stu[i].cj;
if(stu[i].cj>=60&&stu[i].cj<g)
{
money+=20;
}
else if(stu[i].cj>=g&&stu[i].cj<=100)
{
money+=50;
}
}
cout<<money<<endl;
sort(stu,stu+n,cmp);
int j=0;
for(int i=0;i<n;i++)
{
if(i==0||stu[i].cj!=stu[i-1].cj)
j=i+1;
if(j>k)
break;
cout<<j<<" "<<stu[i].name<<" "<<stu[i].cj<<endl;
}
}
L2-028 秀恩爱分得快
古人云:秀恩爱,分得快。
互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度。如果一张照片上出现了 K 个人,这些人两两间的亲密度就被定义为 1/K。任意两个人如果同时出现在若干张照片里,他们之间的亲密度就是所有这些同框照片对应的亲密度之和。下面给定一批照片,请你分析一对给定的情侣,看看他们分别有没有亲密度更高的异性朋友?
输入格式:
输入在第一行给出 2 个正整数:N(不超过1000,为总人数——简单起见,我们把所有人从 0 到 N-1 编号。为了区分性别,我们用编号前的负号表示女性)和 M(不超过1000,为照片总数)。随后 M 行,每行给出一张照片的信息,格式如下:
K P[1] … P[K]
其中 K(≤ 500)是该照片中出现的人数,P[1] ~ P[K] 就是这些人的编号。最后一行给出一对异性情侣的编号 A 和 B。同行数字以空格分隔。题目保证每个人只有一个性别,并且不会在同一张照片里出现多次。
输出格式:
首先输出 A PA,其中 PA 是与 A 最亲密的异性。如果 PA 不唯一,则按他们编号的绝对值递增输出;然后类似地输出 B PB。但如果 A 和 B 正是彼此亲密度最高的一对,则只输出他们的编号,无论是否还有其他人并列。
输入样例 1:
10 4
4 -1 2 -3 4
4 2 -3 -5 -6
3 2 4 -5
3 -6 0 2
-3 2
输出样例 1:
-3 2
2 -5
2 -6
输入样例 2:
4 4
4 -1 2 -3 0
2 0 -3
2 2 -3
2 -1 2
-3 2
输出样例 2:
-3 2
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
bool sex[N];
double q[N][N];
void print(int a,int b){
if(!sex[a]) cout<<'-';
cout<<a<<' ';
if(!sex[b]) cout<<'-';
cout<<b<<'\n';
}
int main()
{
int n,m;
cin>>n>>m;
while(m--)
{
int k; cin>>k;
double qm = 1.0/k;
vector<int> ls;
while(k--)
{
string x; cin>>x;
int num = abs(stoi(x));
if(x[0] != '-') sex[num] = 1;
for(int i = 0; i < ls.size(); i++)//计算两两亲密度
if(sex[num] != sex[ls[i]])
{
q[num][ls[i]] += qm;
q[ls[i]][num] += qm;
}
ls.push_back(num);
}
}
int a,b; cin>>a>>b;
a = abs(a), b = abs(b);
double max1 = 0, max2 = 0;;
for(int i = 0; i < n; i++)
{
if(sex[a] != sex[i])
max1 = max(max1,q[a][i]);
if(sex[b] != sex[i])
max2 = max(max2,q[b][i]);
}
if(q[a][b] == max1 && q[b][a] == max2)
{
print(a,b);
return 0;
}
for(int i = 0; i < n; i++)
if(q[a][i] == max1)
print(a,i);
for(int i = 0; i < n; i++)
if(q[b][i] == max2)
print(b,i);
return 0;
}
L2-029 特立独行的幸福
对一个十进制数的各位数字做一次平方和,称作一次迭代。如果一个十进制数能通过若干次迭代得到 1,就称该数为幸福数。1 是一个幸福数。此外,例如 19 经过 1 次迭代得到 82,2 次迭代后得到 68,3 次迭代后得到 100,最后得到 1。则 19 就是幸福数。显然,在一个幸福数迭代到 1 的过程中经过的数字都是幸福数,它们的幸福是依附于初始数字的。例如 82、68、100 的幸福是依附于 19 的。而一个特立独行的幸福数,是在一个有限的区间内不依附于任何其它数字的;其独立性就是依附于它的的幸福数的个数。如果这个数还是个素数,则其独立性加倍。例如 19 在区间[1, 100] 内就是一个特立独行的幸福数,其独立性为 2×4=8。
另一方面,如果一个大于1的数字经过数次迭代后进入了死循环,那这个数就不幸福。例如 29 迭代得到 85、89、145、42、20、4、16、37、58、89、…… 可见 89 到 58 形成了死循环,所以 29 就不幸福。
本题就要求你编写程序,列出给定区间内的所有特立独行的幸福数和它的独立性。
输入格式:
输入在第一行给出闭区间的两个端点:1<A<B≤10
4
。
输出格式:
按递增顺序列出给定闭区间 [A,B] 内的所有特立独行的幸福数和它的独立性。每对数字占一行,数字间以 1 个空格分隔。
如果区间内没有幸福数,则在一行中输出 SAD。
输入样例 1:
10 40
输出样例 1:
19 8
23 6
28 3
31 4
32 3
注意:样例中,10、13 也都是幸福数,但它们分别依附于其他数字(如 23、31 等等),所以不输出。其它数字虽然其实也依附于其它幸福数,但因为那些数字不在给定区间 [10, 40] 内,所以它们在给定区间内是特立独行的幸福数。
输入样例 2:
110 120
输出样例 2:
SAD
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=10010;
int flagn[maxn]={0};
int getnum(int x)
{
int sum=0;
while(x)
{
sum+=pow((x%10),2);
x/=10;
}
return sum;
}
bool judge(int x)
{
if(x==1||x==0)
return false;
for(int i=2;i<=sqrt(x);i++)
if(x%i==0)
return false;
return true;
}
vector<int>v1,v2;
int main()
{
int a,b;
cin>>a>>b;
for(int i=a;i<=b;i++)
{
int x=i;
int sum=0;
int flag[maxn]={0};
while(1)
{
x=getnum(x);
sum++;
if(x==1)
{
if(judge(i))
sum*=2;
v1.push_back(i);
v2.push_back(sum);
break;
}
if(flag[x])
break;
flag[x]=1;
flagn[x]=1;
}
}
if(v1.size()==0)
{
cout<<"SAD"<<endl;
return 0;
}
for(int i=0;i<v1.size();i++)
{
if(!flagn[v1[i]])
cout<<v1[i]<<" "<<v2[i]<<endl;
}
}
写在最后
🍉🍉🍉不必偏执于未知的真实,身处的当下即是意义和真实,爱才是解题的答案,也是刻画人生色彩的笔尖,耐心的走下去,总会遇到你爱的人和爱你的人。
🍁🍁🍁好啦,本文的内容就到此结束啦,我们下期再见哦!另外在祝各位小伙伴们要天天开心哦!
🍂🍂🍂如果你觉得本文对你有帮助的话,还请不要吝惜您的三连哦!您的支持就是我创作的最大动力!!爱你们💕💕💕