A 四级424
https://www.luogu.com.cn/problem/U545076?contestId=236940
题目描述
大学英语四级考试(CET-4)的分数计算采用常模参照方式。考生的卷面分通过以下公式转换为报道分:
\displaystyle \large \text{报道分} = \frac{\text{卷面分} - \text{常模群体均值}}{\text{常模群体标准差}} \times 70 + 500
其中:
卷面分:考生的实际得分($ 0 \leq S \leq 710 $)。
常模群体均值:常模群体的平均分($ 0 \leq M \leq 710 $)。
常模群体标准差:常模群体分数的离散程度($ 0 < D \leq 1000 $)。
输入格式
输入包含三个整数:
考生的卷面分 $ S ( 0 \leq S \leq 710 $)。
常模群体均值 $ M ( 0 \leq M \leq 710 $)。
常模群体标准差 $ D ( 0 < D \leq 1000 $)。
输出格式
输出一个整数,表示考生的报道分(四舍五入到整数)。
输入输出样例 #1
输入 #1
输出 #1
说明/提示
根据公式:
\text{报道分} = \frac{600 - 500}{100} \times 70 + 500 = 570
测试点数据见附件
代码
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;using u32 = unsigned ;#define i128 __int128; using ll = long long ;using u64 = unsigned long long ;const ll inf = 1e9 ;const ll INF = 1e18 ;signed main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); double s,m,d; cin>>s>>m>>d; double ret=(int )(((s-m)/d)*70 +500 +0.5 ); cout<<ret<<'\n' ; return 0 ; }
B 时间轮回
https://www.luogu.com.cn/problem/U545083?contestId=236940
题目背景
实现一个模拟CPU使用时间片轮转调度算法处理进程的过程。给定每个进程的到达时间、执行时间和时间片大小,输出每个进程的完成时间。
题目描述
在轮转调度算法下,CPU运行进程的规则如下:
初始状态 :CPU空闲,就绪队列为空。
进程到达 :进程到达时,若CPU空闲且队列为空,立即开始执行;否则加入队列末尾。
时间片分配 :每次运行进程最多 quantum 时间。若进程在时间片内完成,CPU空闲;否则剩余时间减少 quantum,放回队列末尾。
队列处理 :队列按先进先出顺序处理。新到达的进程立即加入队列末尾。
上下文切换 :假设切换时间为0。
输入格式
第一行包含两个整数 n n n 和 q u a n t u m quantum q u a n t u m ,分别表示进程的数量和时间片大小。
接下来的 n 行,每行两个整数 a r r i v a l i arrival_i a r r i v a l i 和 b u r s t i burst_i b u r s t i ,表示第 i i i 个进程的到达时间和执行时间。进程按输入顺序编号为 1 1 1 到 n n n 。
输出格式
输出 n n n 个整数,表示每个进程的完成时间,按进程编号顺序输出。
输入输出样例 #1
输入 #1
输出 #1
说明/提示
1 ≤ n ≤ 10⁵
1 ≤ quantum ≤ 10⁹
0 ≤ arrival_i ≤ 10⁹
1 ≤ burst_i ≤ 100
0 ≤ arrivali _i i ≤ 109 ^9 9
代码
这一题就是直接模拟,不要想什么算法。
我们按照要求,在存储数据的时候顺便加上id。
创造排序函数cmp进行排序。
创建队列按照题目要求的规则依次进行处理队首元素,新元素添加到队尾。
不断处理队首元素,如果tim已经超过后续的一些v[i].a,就把这些i也添加进去。
如果队列已为空,但是v数组实际上没有全部添加进来,我们就需要直接将tim跳到接下来的v[i],然后将他添加进去继续进行处理。
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 #include <bits/stdc++.h> using namespace std;using u32 = unsigned ;#define i128 __int128; using ll = long long ;#define int ll using u64 = unsigned long long ;const ll inf = 1e9 ;const ll INF = 1e18 ;struct node { int a,b,id; }; bool cmp (node&x,node&y) { if (x.a!=y.a)return x.a<y.a; else return x.id<y.id; } signed main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); int n,qu; cin>>n>>qu; vector<node>v (n+1 ); for (int i=1 ;i<=n;i++) { int a,b; cin>>a>>b; v[i].a=a,v[i].b=b,v[i].id=i; } sort (v.begin ()+1 ,v.end (),cmp); vector<int >ans (n+1 ); queue<int >q; q.push (1 ); int tim=v[1 ].a; int cnt=2 ; while (q.size ()) { auto & [a,b,id]=v[q.front ()]; int wei=q.front (); int shu=min (qu,b); b-=shu; tim+=shu; while (cnt<=n&&v[cnt].a<=tim) { q.push (cnt); cnt++; } q.pop (); if (b!=0 )q.push (wei); else ans[id]=tim; if (q.empty ()&&tim<v[cnt].a) { tim=v[cnt].a; q.push (cnt); cnt++; } } for (int i=1 ;i<=n;i++)cout<<ans[i]<<" \n" [i==n]; return 0 ; }
C IP围城
题目背景
IP报文是互联网通信的基础数据单元,其结构分为头部和数据两部分。头部包含多个固定长度的控制字段(每个字段的字节位置示意图如下):
字段名
长度 (比特)
描述
版本 (Version)
4
IP协议版本号(IPv4为4,IPv6为6)。
头部长度 (HL)
4
IP头部长度。
服务类型 (ToS)
8
数据包的优先级和服务类型,决定如何处理该数据包。
总长度 (Total Length)
16
数据包的总长度,包含头部和数据部分,单位是字节。
标识 (Identification)
16
唯一标识符,用于数据包分片时的重组。
标志 (Flags)
3
控制数据包是否可以分片,包括“更多分片”标志。
片偏移 (Fragment Offset)
13
当前分片在原始数据包中的位置。
生存时间 (TTL)
8
数据包的生存时间,每经过一个路由器减1,防止数据包在网络中循环。
协议 (Protocol)
8
数据包的负载使用的协议类型(如TCP、UDP等)。
头部校验和 (Header Checksum)
16
校验和,检查IP头部在传输过程中的完整性。
源IP地址 (Source Address)
32
发送数据包的源设备的IP地址。
目的IP地址 (Destination Address)
32
接收数据包的目的设备的IP地址。
题目描述
现给出一个十六进制格式的IP报文头(已去除所有空格):
450000240000400040060000c0a80001c0a80101
请编写程序解析并输出:
总长度(10进制)
标志位(3位二进制转10进制)
目的IP地址(点分十进制格式,如222.22.44.188)
输入格式
输入为一个长度为40的连续的十六进制字符串(不保证IP地址真实合法)
输出格式
输出三行:
第一行为总长度
第二行为标志位
第三行为目的IP地址
输入输出样例 #1
输入 #1
1 450000240000400040060000c0a80001c0a80101
输出 #1
代码
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 33 34 35 36 37 #include <bits/stdc++.h> using namespace std;using u32 = unsigned ;#define i128 __int128; using ll = long long ;using u64 = unsigned long long ;const ll inf = 1e9 ;const ll INF = 1e18 ;int func (char ch) { if (isdigit (ch))return ch-'0' ; else return ch-'a' +10 ; } signed main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); string s; cin>>s; int ret1=0 ; for (int i=7 ;i>=4 ;i--) { ret1+=pow (16 ,7 -i)*func (s[i]); } cout<<ret1<<'\n' ; int ret2=func (s[12 ])>>1 ; cout<<ret2<<'\n' ; for (int i=32 ;i<=39 ;i+=2 ) { int shu=0 ; shu+=func (s[i])*16 +func (s[i+1 ]); cout<<shu; if (i!=38 )cout<<'.' ; } return 0 ; }
D 智能连接
题目背景
某跨国物流集团计划在新建的物流中心部署自动化运输系统。物流中心可视为一个 W × H W \times H W × H 的网格,每个网格单元可设立一个智能物流仓库。集团计划在两个特定仓库间建立运输通道 ,以提升货物流转效率。
题目描述
建设运输通道的规则如下:
选定两个不同仓库位置 ( i , j ) (i,j) ( i , j ) 与 ( i ′ , j ′ ) (i',j') ( i ′ , j ′ ) ,分别支付 A i , j A_{i,j} A i , j 与 A i ′ , j ′ A_{i',j'} A i ′ , j ′ 的仓库激活费用。
通道建设成本为 C × ( ∣ i − i ′ ∣ + ∣ j − j ′ ∣ ) C \times (|i-i'| + |j-j'|) C × ( ∣ i − i ′ ∣ + ∣ j − j ′ ∣ ) 。
总建设成本为仓库激活费与轨道成本之和,需找到最小总成本方案 。
输入格式
第一行三个整数 W , H , C W, H, C W , H , C
接下来 W W W 行,每行 H H H 个整数,表示各位置仓库激活费
输出格式
输出一个整数,表示最小总建设成本。
输入输出样例 #1
输入 #1
1 2 3 4 3 4 2 1 7 7 9 9 6 3 7 7 8 6 4
输出 #1
说明/提示
选择 ( 1 , 1 ) (1,1) ( 1 , 1 ) 与 ( 2 , 3 ) (2,3) ( 2 , 3 ) 建设通道:
激活费 1 + 3 = 4 1+3=4 1 + 3 = 4
轨道成本 2 × ( ∣ 1 − 2 ∣ + ∣ 1 − 3 ∣ ) = 2 × 3 = 6 2 \times (|1-2| + |1-3|) = 2 \times 3 = 6 2 × ( ∣ 1 − 2 ∣ + ∣ 1 − 3 ∣ ) = 2 × 3 = 6
总成本 4 + 6 = 1 0 4+6=10 4 + 6 = 1 0
代码
这一题感觉就是思路 ,有两个成本 仓库激活费与轨道成本
其中shu[i][j]存到轨道成本-仓库激活费 , 因为两个仓库间的轨道成本本来就是相减出来的,所以这两个可以直接相减,然后仓库激活费就直接存的负数就可以算了。
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 #include <bits/stdc++.h> using namespace std;using u32 = unsigned ;#define i128 __int128; using ll = long long ;#define int ll using u64 = unsigned long long ;const ll inf = 1e9 ;const ll INF = 1e18 ;signed main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); int n,m,c; cin>>n>>m>>c; vector<vector<int >>a (n+1 ,vector <int >(m+1 )); vector<vector<int >>shu (n+1 ,vector <int >(m+1 )); vector<vector<int >>maxn (n+1 ,vector <int >(m+1 )); for (int i=1 ;i<=n;i++) { for (int j=1 ;j<=m;j++)cin>>a[i][j]; } for (int i=1 ;i<=n;i++) { for (int j=1 ;j<=m;j++) { shu[i][j]=1ll *c*(i+j)-a[i][j]; maxn[i][j]=shu[i][j]; } } for (int i=1 ;i<=n;i++) { for (int j=1 ;j<=m;j++) { if (i>1 )maxn[i][j]=max (maxn[i][j],maxn[i-1 ][j]); if (j>1 )maxn[i][j]=max (maxn[i][j],maxn[i][j-1 ]); } } int ret=LLONG_MAX; for (int i=1 ;i<=n;i++) { for (int j=1 ;j<=m;j++) { if (i>1 )ret=min (ret,shu[i][j]+2 *a[i][j]-maxn[i-1 ][j]); if (j>1 )ret=min (ret,shu[i][j]+2 *a[i][j]-maxn[i][j-1 ]); } } cout<<ret<<'\n' ; return 0 ; }
E 这是签到
这一题好像是签到题,也已经找不到题目了,就不写了
F 魔法学院的旋转椅子
https://atcoder.jp/contests/abc186/tasks/abc186_e
代码
这一题主要用的是exgcd(扩展欧几里得算法)我们首先求得最近移动到位置1需要移动cha步,然后其实所有移动到1得可能距离为cha+n * y,我们假设移动了x次,则cha+n * y=k * x;根据扩展欧几里得算法就可以算出x的通解
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 #include <bits/stdc++.h> using namespace std;using u32 = unsigned ;#define i128 __int128 using ll = long long ;#define int ll using u64 = unsigned long long ;const ll inf = 1e9 ;const ll INF = 1e18 ;int exgcd (int a,int b,int &x,int &y) { if (b==0 ) { x=1 ,y=0 ; return a; } int x1,y1,d; d=exgcd (b,a%b,x1,y1); x=y1,y=x1-a/b*y1; return d; } void solve () { int n,s,k; cin>>n>>s>>k; int cha=n-s; if (cha==n)return cout<<0 <<'\n' ,void (); int x,y; int d=exgcd (k,n,x,y); if (cha%d!=0 )return cout<<-1 <<'\n' ,void (); int x0=x*(cha/d); int bei=n/d; int ret=((x0%bei)+bei)%bei; cout<<ret<<'\n' ; } signed main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); int tt;cin>>tt; while (tt--){ solve (); } return 0 ; }
G 星际通信网络
https://codeforces.com/problemset/problem/1805/D
代码
原作者
题意 :
给你一棵有 n 个节点的树,有一个无向图 G,当点对 (a, b) 在树中距离大于等于 k 的时候, G 中的 a, b 之间有一条无向边,问你当 k = 1, 2, 3…n 的时候,G 中的连通块数量
我们可以先跑出树的直径,如果 k > 直径大小, 说明树中所有的点都是孤立的,否则,直径的两个端点一定是在一个连通块中的,然后对于每个 k 我们找到有多少点无法 加入这个连通块 ,即有多少点到两个端点的距离都小于 k,我们预处理 出每个点到直径两端距离的最大值,然后排序,用一个指针优化找的过程。
这样做为什么是对的呢?我们发现,当一个点不是孤立点 ,他一定是和直径端点在同一个连通块中,我们可以用反证法 证明:
设直径两端点分别为 a, b, 现在有两个点 c, d。c, d 在同一个连通块中。
假设 c,d 和 a, b 不在同一个连通块中:
so,当 c, d在同一个连通块中时,c,d一定和a,b在同一个连通块中,那么上述方法就是正确的
树的直径做法:先随便找一个点,跑一个 dfs,记录每一个点的深度,然后找到深度最大的那个点,他就是直径的一个端点,然后从这个点在跑一遍,找到深度最大的点,这个点就是另一个端点,证明略
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 #include <bits/stdc++.h> using namespace std;using u32 = unsigned ;#define i128 __int128; using ll = long long ;using u64 = unsigned long long ;const ll inf = 1e9 ;const ll INF = 1e18 ;signed main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); int n; cin>>n; vector<vector<int >>adj (n+1 ); for (int i=1 ;i<=n-1 ;i++) { int u,v; cin>>u>>v; adj[u].push_back (v); adj[v].push_back (u); } vector<int >dis (n+1 ,-1 ); auto bfs=[&](int x) { queue<int >q; dis.assign (n+1 ,-1 ); q.push (x); dis[x]=0 ; while (q.size ()) { int x=q.front (); q.pop (); for (auto y:adj[x]) { if (dis[y]==-1 ) { dis[y]=dis[x]+1 ; q.push (y); } } } return max_element (dis.begin ()+1 ,dis.end ())-dis.begin (); }; int x=bfs (1 ); int y=bfs (x); auto dx=dis; bfs (y); auto dy=dis; vector<int >ans (n+1 ); for (int i=1 ;i<=n;i++) { ans[max (dx[i],dy[i])+1 ]++; } ans[0 ]+=1 ; ans[dx[y]+1 ]-=1 ; for (int i=1 ;i<=n;i++) { ans[i]+=ans[i-1 ]; } for (int i=1 ;i<=n;i++)cout<<ans[i]<<" \n" [i==n]; return 0 ; }
H 有思维的AI
https://codeforces.com/problemset/problem/2028/E
代码
I 合成大猪猪
题目描述
P19E99 最近沉迷于一款名为《合成大猪猪》的游戏。游戏规则如下:
给定猪猪的掉落顺序,请输出最终容器中从底部到顶部的猪猪排列。
输入格式
第一行一个整数 n ( 1 ≤ n ≤ 1 0 6 ) n\ (1 \le n\le 10^6) n ( 1 ≤ n ≤ 1 0 6 ) ,表示猪猪的数量。
第二行 n n n 个整数 a i ( 1 ≤ a i ≤ 1 0 6 ) a_i\ (1\le a_i\le 10^6) a i ( 1 ≤ a i ≤ 1 0 6 ) ,表示猪猪的大小和掉落顺序。
输出格式
输出一行整数,表示容器最终从底部到顶部 的猪猪大小序列。
输入输出样例 #1
输入 #1
输出 #1
输入输出样例 #2
输入 #2
输出 #2
代码
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 33 #include <bits/stdc++.h> using namespace std;using u32 = unsigned ;#define i128 __int128; using ll = long long ;using u64 = unsigned long long ;const ll inf = 1e9 ;const ll INF = 1e18 ;const int N=1e6 +10 ;int a[N];int cnt=0 ;signed main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); int n; cin>>n; for (int i=1 ;i<=n;i++) { int x; cin>>x; a[++cnt]=x; while (cnt>=2 &&a[cnt]==a[cnt-1 ]) { a[cnt-1 ]++; cnt--; } } for (int i=1 ;i<=cnt;i++)cout<<a[i]<<" \n" [i==cnt]; return 0 ; }
J 猪猪大王的赏赐
题目背景
小肥猪国附近有怪物出没,有 k k k 位猪猪勇者对怪物进行讨伐并凯旋而归,猪猪大王十分高兴,决定拿出一条长度为 n n n 的原始魔法咒语 s s s 对这 k k k 位猪猪勇士进行赏赐。
但是小肥猪世界中魔力强大的咒语只能为回文串 ,这意味着猪猪大王需要将这条长为 n n n 的原始魔法咒语分成 k k k 份回文串 赏给勇者,若无法分成 k k k 份回文串,猪猪大王将会使用若干次无敌的神肥猪魔法,将原始魔法咒语中的一个字母变为其他的任意字母。现在请你帮猪猪大王算一算,他至少需要使用多少次无敌的神肥猪魔法,才能将这条原始魔法咒语分成 k k k 份回文串赏给勇者。
题目描述
小肥猪国附近有怪物出没,有 k k k 位猪猪勇者对怪物进行讨伐并凯旋而归,猪猪大王十分高兴,决定拿出一条长度为 n n n 的原始魔法咒语 s s s 对这 k k k 位猪猪勇士进行赏赐。
但是小肥猪世界中魔力强大的咒语只能为回文串 ,这意味着猪猪大王需要将这条长为 n n n 的原始魔法咒语分成 k k k 份回文串 赏给勇者,若无法分成 k k k 份回文串,猪猪大王将会使用若干次无敌的神肥猪魔法,将原始魔法咒语中的一个字母变为其他的任意字母。现在请你帮猪猪大王算一算,他至少需要使用多少次无敌的神肥猪魔法,才能将这条原始魔法咒语分成 k k k 份回文串赏给勇者。
输入格式
第一行两个整数 n , k ( 1 ≤ k ≤ n ≤ 1 0 0 ) n,\ k\ (1\le k\le n\le 100) n , k ( 1 ≤ k ≤ n ≤ 1 0 0 ) ,表示的原始魔法咒语的长度和勇者的个数。
第二行一个字符串 s s s ,表示猪猪大王的原始魔法咒语。
输出格式
一行一个整数,表示猪猪大王至少需要使用多少次无敌的神肥猪魔法。
输入输出样例 #1
输入 #1
输出 #1
说明/提示
样例解释 :你可以把原始魔法咒语分割成 “ab” 和 “c”,并修改 “ab” 中的 1 个字符,将它变成回文串。
代码
leetcode上的题
使用动态规划,实际上不难,这一题的数据范围也很小,可以支持O(n3 ),但是dp写少了,没敢写,实际不难。
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 33 34 35 36 37 38 39 40 41 42 43 44 45 #include <bits/stdc++.h> using namespace std;using u32 = unsigned ;#define i128 __int128; using ll = long long ;using u64 = unsigned long long ;const ll inf = 1e9 ;const ll INF = 1e18 ;int cost (string&s,int l,int r) { int ret=0 ; for (int i=l,j=r;i<=j;i++,j--) { if (s[i]!=s[j])ret++; } return ret; } signed main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); int n,k; cin>>n>>k; string s; cin>>s; vector<vector<int >>f (n+1 ,vector <int >(k+1 ,INT_MAX)); f[0 ][0 ]=0 ; for (int i=1 ;i<=n;i++) { for (int j=1 ;j<=min (k,i);j++) { if (j==1 )f[i][j]=cost (s,0 ,i-1 ); else { for (int i0=j-1 ;i0<i;i0++) { f[i][j]=min (f[i][j],f[i0][j-1 ]+cost (s,i0,i-1 )); } } } } cout<<f[n][k]<<'\n' ; return 0 ; }
K 更多猪猪币!
题目描述
P19E99 正在小肥猪国参加捞金活动。
长桌子上摆放着 n n n 个猪猪币,每个猪猪币有一个对应的面额。你需要从中选择连续的 k k k 个猪猪币。作为一只小笨猪,P19E99 不知道该如何选择才能得到最大的总面额。请你帮助他找出能获得的最大总面额。
输入格式
第一行输入两个整数 n , k ( 1 ≤ k ≤ n ≤ 2 × 1 0 6 ) n,\ k\ (1\le k\le n\le 2\times 10^6) n , k ( 1 ≤ k ≤ n ≤ 2 × 1 0 6 ) ,具体意义见题目描述。
第二行输入 n n n 个整数 a i ( 1 ≤ a i ≤ 1 0 6 ) a_i\ (1\le a_i\le 10^6) a i ( 1 ≤ a i ≤ 1 0 6 )
输出格式
输出一个整数,表示 P19E99 能获得的最大总面额。
输入输出样例 #1
输入 #1
输出 #1
代码
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 33 34 #include <bits/stdc++.h> using namespace std;using u32 = unsigned ;#define i128 __int128; using ll = long long ;#define int ll using u64 = unsigned long long ;const ll inf = 1e9 ;const ll INF = 1e18 ;signed main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); int n,k; cin>>n>>k; vector<int >a (n+1 ); for (int i=1 ;i<=n;i++) { cin>>a[i]; } int sum=0 ; int ret=0 ; for (int i=1 ;i<k;i++)sum+=a[i]; for (int i=k;i<=n;i++) { sum+=a[i]; sum-=a[i-k]; ret=max (ret,sum); } cout<<ret<<'\n' ; return 0 ; }
L 谁是笨宝宝
https://www.luogu.com.cn/problem/U545098?contestId=236940
题目背景
P19E99 和 SkySummer 互相觉得对方是笨宝宝,于是他们通过下棋来决定谁是笨宝宝,两人准备了一个半径为 R R R 的特殊棋盘,和两种颜色半径为 r r r 的棋子无数个,P19E99 先手。棋盘上的棋子之间不能相互堆叠(即棋子圆心距离应 > 2 r >2r > 2 r ),棋子的中心必须落在棋盘内。
当一方下棋时,棋盘上没有空间可以让他继续落子,那么他就输掉了本局游戏,获得笨宝宝的称号。
现在给你棋盘的半径 R R R ,和棋子的半径 r r r ,请你输出谁是笨宝宝。
题目描述
P19E99 和 SkySummer 互相觉得对方是笨宝宝,于是他们通过下棋来决定谁是笨宝宝,两人准备了一个半径为 R R R 的特殊棋盘,和两种颜色半径为 r r r 的棋子无数个,P19E99 先手。棋盘上的棋子之间不能相互堆叠(即棋子圆心距离应 > 2 r >2r > 2 r ),棋子的中心必须落在棋盘内。
当一方下棋时,棋盘上没有空间可以让他继续落子,那么他就输掉了本局游戏,获得笨宝宝的称号。
现在给你棋盘的半径 R R R ,和棋子的半径 r r r ,请你输出谁是笨宝宝。
输入格式
第一行输入两个整数 R , r ( 1 ≤ r ≤ 3 r ≤ R ≤ 1 0 1 2 ) R,\ r\ (1\le r\le 3r\le R\le 10^{12}) R , r ( 1 ≤ r ≤ 3 r ≤ R ≤ 1 0 1 2 ) ,分别表示棋盘的半径和棋子的半径。
输出格式
输出 P19E99 或 SkySummer 表示谁是笨宝宝。
输入输出样例 #1
输入 #1
输出 #1
代码
这一题先手必赢,首先下最中间,然后另一个人无论下哪里都下对称的位置就行了,一定是后手下的先没有位置下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <bits/stdc++.h> using namespace std;using u32 = unsigned ;#define i128 __int128; using ll = long long ;using u64 = unsigned long long ;const ll inf = 1e9 ;const ll INF = 1e18 ;signed main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); int R,r; cin>>R>>r; cout<<"SkySummer\n" ; return 0 ; }