杭十三中冠军联赛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}​

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

  • 1.此题给定的是直径d而非半径r

  • 2.保留3位输出需使用printf的%.3lf(具体看std)

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)

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

  • 1.反斜杠\这个字符在C++中是转义符,如果单单一个\在字符串中会将后面的字符转义,从而导致我们不想要的效果,所以我们需要打两个\\将自己转义(反斜杠转义后便是一个正常的字符)便可

  • 2.双引号",如果你打在引号中的话程序会认为你这个引号是一个字符串的结尾从而导致问题,我们只要手动在定义字符串后将应该是"的那个字符用ASCII码调整成双引号即可

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 作为主题。