杭十三中冠军联赛S1 Extra Round 题解

$$ \texttt{ Writer:世界最蒻Dilute}$$

$$\texttt{ #A 某脱碳甲醛的电磁炮题}$$

 出题人 Dilute\texttt{ 出题人 Dilute}​

电流公式I=URI=\frac{U}{R}大家都知道(不知道的话在题面中也给出了)

所以直接输出就可以了(ps:C++中除法自动向下取整)

std by Dilute

1
2
3
4
5
6
7
8
9
10
11
#include<bits/stdc++.h>

using namespace std;

int main(){
int U, R;
scanf("%d %d", &U, &R);
int Ans = U / R;
printf("%d", Ans);
return 0;
}

$$\texttt{ #B 黑子的瞬移范围}$$

 出题人 SLYZ_0120\texttt{ 出题人 SLYZ\_0120}​

跟上一题差不多,但是坑点有二:

std by SLYZ_0120

1
2
3
4
5
6
7
8
9
#include<bits/stdc++.h>
using namespace std;
int d;
double s;
int main(){
scanf("%d",&d);
printf("%.3lf",d*d*3.1415926/4);
return 0;
}

$$\texttt{ #C 末日的时候有空吗?在干什么?可以来AK吗?}$$

 出题人 Dilute\texttt{ 出题人 Dilute}​

这可能是整场比赛代码最长的题?QwQ

由题目我们经过一番思考我们会想出来一个策略:先从较弱(即消耗法力值较小)的“兽”开始打,打倒无法再打下去为止

由此我们可以对表示wiw_i的序列排序再从前往后做即可

std by Dilute

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<bits/stdc++.h>

using namespace std;

int w[10010];

int main(){
int n, m;
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++)
scanf("%d", &w[i]);
sort(w+1, w+n+1); // 排序
for(int i = 1; i <= n; i++){
m -= w[i]; // 消耗掉该“兽”所需要的法力值
if(m <= 0){
printf("%d", i - 1); // 如果法力值耗尽,那么应该在第i - 1只“兽”就停止
return 0;
}
}
printf("%d", n); // 如果一直到最后都没有耗尽法力,那么久表示可以将所有“兽”杀死
}

我珂美如画!

$$\texttt{ #D 打怪升级}$$

 出题人 SLYZ_0120\texttt{ 出题人 SLYZ\_0120}

我们直接按照题意,模拟桐人和亚丝娜打怪升级的过程

教大家一个指令 pow(a,b)pow(a, b)可以表示aba^baabb次方

std by SLYZ_0120

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<bits/stdc++.h>
using namespace std;
int n;
int ans = 0;
int main(){
scanf("%d",&n);
for(int i = 1;i<n;i++){
ans += pow(2,i-1);
}
ans *= 2;
printf("%d",ans);
return 0;
}

$$\texttt{ #E 结构体排序}$$

 出题人 bh1234666\texttt{ 出题人 bh1234666}​

第一种思路

我们进行多次排序,首先以aa为关键字,排序完成之后对于a相等的几个进行第二次排序,最后输出即可

std by bh1234666

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
#include<bits/stdc++.h>
using namespace std;
struct paixu{
int a,b;
}a[100005];
int cmp1(paixu x,paixu y)
{
return x.a<y.a;
}
int cmp2(paixu x,paixu y)
{
return x.b<y.b;
}
int main()
{
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d%d",&a[i].a,&a[i].b);
sort(a,a+n,cmp1);
int flag=0;
for(i=0;i<n;i++)
if(a[i].a!=a[flag].a)
{
sort(a+flag,a+i,cmp2);
flag=i;
}
sort(a+flag,a+i,cmp2);
for(i=0;i<n;i++)
printf("%d %d\n",a[i].a,a[i].b);
return 0;
}

第二种思路

其实只用一次排序就行了QwQ(只要在Cmp加入aa相等的情况即可)

std by Dilute

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<bits/stdc++.h>

using namespace std;

struct Node{
int a;
int b;
}Num[100010];

bool Cmp(Node a, Node b){
if(a.a == b.a)
return a.b < b.b;
return a.a < b.a;
}

int main(){
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d %d", &Num[i].a, &Num[i].b);
sort(Num + 1, Num + n + 1, Cmp);
for(int i = 1; i <= n; i++)
printf("%d %d\n", Num[i].a, Num[i].b);
}

$$\texttt{ #F 诡异的字符}$$

 出题人 bh1234666\texttt{ 出题人 bh1234666}

这题非常不常规……(但是并不能改变这是道大水题的事实QwQ)

这题要求输出的字符串中有两个问题:

std by bh1234666

1
2
3
4
5
6
7
8
9
#include<cstdio>
char a[]="!@#$%^&*()[]{};:' \\|,<.>/?`~-_=+`~";
int main()
{
a[17]=34; // 双引号的ASC码为34
// 上面那行中的34等价于'"'
puts(a);
return 0;
}

$$\texttt{ #G 身份证号}$$

 出题人 bh1234666\texttt{ 出题人 bh1234666}​

不难得出字符串710位为年份,1112位为月份,13~14位为日期,那么把前面六位读进垃圾桶,再读进四位,输出刚刚读进的四位,输出空格,读进两位,输出刚刚读进的两位,再空格,最后读进两位,输出两位就行了

std by bh1234666

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<cstdio>
int main()
{
char x;
scanf("%*c%*c%*c%*c%*c%*c%c",&x);
printf("%c",x);
scanf("%c",&x);
printf("%c",x);
scanf("%c",&x);
printf("%c",x);
scanf("%c",&x);
printf("%c",x);
printf(" ");
scanf("%c",&x);
printf("%c",x);
scanf("%c",&x);
printf("%c",x);
printf(" ");
scanf("%c",&x);
printf("%c",x);
scanf("%c",&x);
printf("%c",x);
return 0;
}

本场比赛的出题人们

Dilute 卢景行
SLYZ_0120 杨茗
bh1234666 包涵

最后,我想说

哦景真老师你真是太帅了!

哦景真老师你真是太帅了!

哦景真老师你真是太帅了!

QwQ


QQ

|

Codeforces

|

Luogu

|

Github
本站由 Hexo 驱动,使用 Azurus 作为主题。