记录洛谷刷题C语言qaq
[CCC2022 J2] Fergusonball Ratings
题目描述
现在有一个球队需要你评价。
球队中的第 i i i 个人进了 a i a_i ai 个球,犯规了 b i b_i bi 次。
所以第 i i i 个人的分数就是 5 × a i − 3 × b i 5\times a_i-3\times b_i 5×ai−3×bi 。
如果第 i i i 个人的分数大于 40 40 40 ,那么这个人就是一个黄金球员。
相对应的,如果这个球队的所有人都是黄金球员,那么这个球队就是一个黄金球队。
输入格式
第一行一个整数 n n n ,表示球队的人数。
接下来 2 n 2n 2n 行,第 2 i − 1 2 i - 1 2i−1 行表示 a i a_i ai,第 2 i 2 i 2i 行表示 b i b_i bi 。
输出格式
共一行,表示黄金球员的数量。如果这是一个黄金球队,请再输出一个 +
。
样例 #1
样例输入 #1
3
12
4
10
3
9
1
样例输出 #1
3+
样例 #2
样例输入 #2
2
8
0
12
1
样例输出 #2
1
提示
对于全部数据: 1 ≤ n ≤ 20 , 1 ≤ a i , b i ≤ 2000 1\le n\le 20,1\le a_i,b_i\le2000 1≤n≤20,1≤ai,bi≤2000
代码如下:
C语言
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main()
{
int n;
scanf("%d",&n);
int sum = 0;
for(int i = 0;i < n;i++)
{
int a,b;
scanf("%d",&a);
scanf("%d",&b);
int num = a*5 - b*3;
if(num > 40)
{
sum++;
}
}
printf("%d",sum);
if(sum == n)
printf("+\n");
return 0;
}
C++
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int sum = 0;
for (int i = 0; i < n; i++)
{
int a, b;
cin >> a >> b;
int num = a * 5 - b * 3;
if (num > 40)
sum++;
}
cout << sum;
if (sum == n)
cout << "+";
return 0;
}
「SvR-1」Don’t Mozheng. /oh
题目背景
Problem Number: 58 \textit{58} 58
在 Guluo Academic 群中,大家正在魔怔。
洛谷博客上的《魔怔导论》:https://www.luogu.com.cn/blog/supervise/how-to-get-a-mz。
需要《魔怔导论》(目前更新至 v1.1.1 版本)的 PDF 请于下方「题目附件」处下载。
题目描述
你得到了 n n n 条信息,这些信息共有三种类型(注意 < str > \texttt<\textit{str}\texttt> <str> 描述一个名为 s t r str str 的字符串,该字符串不含空格、字符 : \texttt: : 与 / \texttt/ /,不含两边的尖角括号):
- 形如 < str >: \texttt<\textit{str}\texttt{>:} <str>:。意为接下来一行的一条信息是名为 s t r str str 的用户发的。
- 形如 /< s t r > \texttt{/<}str\texttt> /<str>。意为一条名称为 s t r str str 的表情信息。
- 形如 < str > \texttt<\textit{str}\texttt> <str>。意为一条内容为 s t r str str 的文字信息。
你经过长期观察,发现名称为 oh \texttt{oh} oh 和 hsh \texttt{hsh} hsh 的表情信息具有魔怔的意味。
并且在一段对话中:
- 一个 oh \texttt{oh} oh 表情会增加 a a a 的魔怔值。
- 一个 hsh \texttt{hsh} hsh 表情会增加 b b b 的魔怔值。
- 其他的任何信息都不会影响魔怔值,魔怔值初始为 0 0 0。
现在你需要对于这些信息,计算出总的魔怔值。
输入格式
第一行三个整数 n , a , b n,a,b n,a,b,表示共有 n n n 条信息, a , b a,b a,b 意义如题述。
接下来 2 × n 2\times n 2×n 行,描述每条信息:
- 第一行是第 1 类信息。
- 第二行是第 2 类或第 3 类信息。
输出格式
仅一行一个整数,即总的魔怔值。
样例 #1
样例输入 #1
7 1 2020
wop:
/yueliang
eoq:
wop_loushang
wop:
eoq_npy_when
eoq:
/oh
dek:
/oh
rif:
NOI2022_rp_++
rif:
/hsh
样例输出 #1
2022
提示
样例 1 说明
如图所示。
数据规模与约定
本题采用捆绑测试。
记 l l l 表示输入中单行信息的最大长度。
Subtask n ≤ 特殊性质 分值 1 ≤ 10 − 20 2 ≤ 100 − 20 3 无特殊限制 A 20 4 无特殊限制 − 40 \newcommand{\arraystretch}{1.5} \begin{array}{c|c|c|c}\hline\hline \textbf{Subtask} & \bm{n\le} & \textbf{特殊性质} & \textbf{分值} \\\hline \textsf{1} & \le 10 & - & 20 \\\hline \textsf{2} & \le 100 & - & 20 \\\hline \textsf{3} & \text{无特殊限制} & \text A & 20 \\\hline \textsf{4} & \text{无特殊限制} & - & 40 \\\hline\hline \end{array} Subtask1234n≤≤10≤100无特殊限制无特殊限制特殊性质−−A−分值20202040
- 特殊性质 A \text{A} A:输入不含有第 3 类信息。
对于 100 % 100\% 100% 的数据,有 1 ≤ n ≤ 1 0 4 1\le n\le 10^4 1≤n≤104, 1 ≤ l ≤ 50 1\le l\le 50 1≤l≤50, 1 ≤ a , b ≤ 1 0 3 1\le a,b\le 10^3 1≤a,b≤103。
代码如下:
C语言
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int n,a,b,ans;//定义变量
int main(){
scanf("%d%d%d",&n,&a,&b) ;
char str1[1001],str2[1001];//定义字符串
for(int i=1;i<=n;i++){
scanf("%s%s",&str1,&str2);
int qwq=strlen(str2);//判断长度
if(str2[0]=='/'){//判断第一个字符
if(qwq==3&&str2[1]=='o'&&str2[2]=='h') //判断是否为"/oh"
ans=ans+a;//答案加a
if(qwq==4&&str2[1]=='h'&&str2[2]=='s'&&str2[3]=='h') //判断是否为“/hsh"
ans=ans+b;//答案加b
else continue;//否则继续循环
}
}
printf("%d\n",ans);
return 0;//结束程序
}
C++
#include<iostream>
using namespace std;
int n,a,b,ans;//定义变量
int main(){
cin>>n>>a>>b;//输入
string str1,str2;//定义字符串
for(int i=1;i<=n;i++){
cin>>str1>>str2;//输入
int qwq=str2.length();//判断长度
if(str2[0]=='/'){//判断第一个字符
if(qwq==3&&str2[1]=='o'&&str2[2]=='h') //判断是否为"/oh"
ans=ans+a;//答案加a
if(qwq==4&&str2[1]=='h'&&str2[2]=='s'&&str2[3]=='h') //判断是否为“/hsh"
ans=ans+b;//答案加b
else continue;//否则继续循环
}
}
cout<<ans<<endl;//输出
return 0;//结束程序
}
gcd.
题目背景
与你借星火,容我题山河。
题目描述
T T T 组数据,每一组数据给定 l , r , x l,r,x l,r,x,试求: gcd ( ⌊ l x ⌋ , ⌊ l + 1 x ⌋ , ⋯ , ⌊ r x ⌋ ) \gcd(\lfloor \frac{l}{x}\rfloor,\lfloor \frac{l+1}{x}\rfloor,\cdots,\lfloor \frac{r}{x}\rfloor) gcd(⌊xl⌋,⌊xl+1⌋,⋯,⌊xr⌋) 的值。
- 其中 gcd \gcd gcd 表示求最大公约数,例如 gcd ( 6 , 9 ) = 3 \gcd(6,9)=3 gcd(6,9)=3, gcd ( 2 , 4 , 8 ) = 2 \gcd(2,4,8)=2 gcd(2,4,8)=2, gcd ( 5 , 6 , 7 ) = 1 \gcd(5,6,7)=1 gcd(5,6,7)=1。特别地,我们定义一个正整数的最大公约数是它自身。
- ⌊ x ⌋ \lfloor x \rfloor ⌊x⌋ 表示 x x x 向下取整,例如 ⌊ 3.14 ⌋ = 3 \lfloor 3.14 \rfloor=3 ⌊3.14⌋=3。
输入格式
第一行输入一个正整数 T T T,表示数据组数。
对于每一组数据,输入一行三个正整数 l , r , x l,r,x l,r,x,以空格隔开。
输出格式
对于每一组数据,输出一行,一个正整数表示答案。
样例 #1
样例输入 #1
4
3 6 1
8 11 4
4 4 3
7 16 2
样例输出 #1
1
2
1
1
提示
【样例解释和说明】
样例中的 T = 4 T=4 T=4,说明有 4 4 4 组数据。
- 对于第一组数据, l = 3 , r = 6 , x = 1 l=3,r=6,x=1 l=3,r=6,x=1,即求 gcd ( ⌊ 3 1 ⌋ , ⌊ 4 1 ⌋ , ⌊ 5 1 ⌋ , ⌊ 6 1 ⌋ ) = 1 \gcd(\lfloor \frac{3}{1}\rfloor,\lfloor \frac{4}{1} \rfloor, \lfloor \frac{5}{1}\rfloor,\lfloor \frac{6}{1}\rfloor)=1 gcd(⌊13⌋,⌊14⌋,⌊15⌋,⌊16⌋)=1。
- 对于第二组数据, l = 8 , r = 11 , x = 4 l=8,r=11,x=4 l=8,r=11,x=4,即求 gcd ( ⌊ 8 4 ⌋ , ⌊ 9 4 ⌋ , ⌊ 10 4 ⌋ , ⌊ 11 4 ⌋ ) = gcd ( 2 , 2 , 2 , 2 ) = 2 \gcd(\lfloor \frac{8}{4} \rfloor,\lfloor \frac{9}{4} \rfloor,\lfloor \frac{10}{4}\rfloor,\lfloor \frac{11}{4}\rfloor)=\gcd(2,2,2,2)=2 gcd(⌊48⌋,⌊49⌋,⌊410⌋,⌊411⌋)=gcd(2,2,2,2)=2。
- 对于第三组数据, l = 4 , r = 4 , x = 3 l=4,r=4,x=3 l=4,r=4,x=3,即求 gcd ( ⌊ 4 3 ⌋ ) = 1 \gcd(\lfloor \frac{4}{3}\rfloor)=1 gcd(⌊34⌋)=1。
- 对于第四组数据,类似可得结果是 1 1 1。
【数据范围】
- 对于 10 % 10\% 10% 的数据, x = 1 x=1 x=1。
- 另有 10 % 10\% 10% 的数据, l = r l=r l=r。
- 另有 20 % 20\% 20% 的数据, r − l ≤ 1 0 5 r-l \leq 10^5 r−l≤105。
- 对于上述的前 40 % 40\% 40% 的数据, 1 ≤ x ≤ l ≤ r ≤ 1 0 9 1 \leq x \leq l \leq r \leq 10^9 1≤x≤l≤r≤109。
- 对于所有数据, 1 ≤ x ≤ l ≤ r ≤ 1 0 18 1 \leq x \leq l \leq r \leq 10^{18} 1≤x≤l≤r≤1018, 1 ≤ T ≤ 10 1 \leq T \leq 10 1≤T≤10。
代码如下:
C语言
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
long long l, r, x; //本题唯一坑点,要记得开 long long。
scanf("%lld%lld%lld", &l, &r, &x);
if (l / x != r / x) puts("1");
else printf("%lld\n", l / x);
}
return 0;
}
C++
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int T;
cin >> T;
while (T--)
{
long long l, r, x; //本题唯一坑点,要记得开 long long。
cin >> l >> r >> x;
if (l / x != r / x) puts("1");
else printf("%lld\n", l / x);
}
return 0;
}
[Aya Round 1 A] 幻想乡扑克游戏
题目背景
Problem Number: 22 \textit{22} 22
在能力卡牌异变之后,幻想乡的少女们将多余的卡牌收集起来,仿照外界人的「斗地主」这一游戏,进行了愉快的玩耍。
题目描述
斗地主是一种使用 A \tt A A 到 K \tt K K 加上大小王的共 54 54 54 张扑克牌来进行的游戏,其中大小王各一张,其它数码牌各四张。在斗地主中,牌的大小关系根据牌的数码表示如下:
3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < J < Q < K < A < 2 < 小王 wxy < 大王 \tt 3<4<5<6<7<8<9<10<J<Q<K<A<2<\stackrel{\mathclap{\color{white}\textbf{\textit{wxy}}}}{\text{小王}} < \text{大王} 3<4<5<6<7<8<9<10<J<Q<K<A<2<小王wxy<大王
且牌的大小关系和花色无关。
游戏开始时,将会给 3 3 3 名玩家各自发放 17 17 17 张牌作为手牌,余下三张作为底牌。玩家会将牌从大到小排序理好,然后根据自己牌型的好坏程度来选择是否叫地主。
你认为,如果自己的手牌中存在王炸(即大小王各一张)或者至少一个炸弹(即四张数码相同的牌),则你会选择叫地主。
请实现一个程序来判断你是否应该叫地主。
输入格式
本题包含多组数据。
- 第一行输入一个整数 T T T,表示数据组数。
- 接下来 T T T 行,每行输入一个长度为 17 17 17 的字符串,表示你的手牌。保证牌已经预先理好。在输入中使用 T \tt T T 代表点数为 10 \tt 10 10 的牌,使用 X \tt X X 代表小王,使用 D \tt D D 代表大王。
输出格式
- 输出共 T T T 行。
- 对于每组数据,输出一行一个字符串:
yes
代表你应该叫地主。no
代表你不应该叫地主。
- 你可以输出字符串的任意大小写形式。例如:字符串
yes
、Yes
、YES
均会被视为表示应该叫地主。
样例 #1
样例输入 #1
3
X2AAKKKKQT9765433
DX22AKKQJTT884443
X2AAAKQQJT8554433
样例输出 #1
Yes
Yes
No
提示
样例解释
对于数据 1 1 1,输入数据相当于下面的手牌(忽略花色):
该手牌中存在炸弹:
故你选择叫地主。
对于数据 2 2 2,输入数据相当于下面的手牌(忽略花色):
该手牌中存在王炸:
故你选择叫地主。
对于数据 3 3 3,输入数据相当于下面的手牌(忽略花色):
该手牌中不存在王炸和炸弹。故你选择不叫地主。
数据范围与约定
对于 100 % 100\% 100% 的数据, 1 ≤ T ≤ 1 0 4 1 \le T \le 10^4 1≤T≤104。保证牌已经预先理好。
代码如下:
C语言
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main()
{
int T, b[128];
scanf("%d",&T);
while (T--)
{
memset(b, 0, sizeof(b));//多测清空
int flag = 0;
char s[1001];
scanf("%s",&s);
for (int i = 0; i < strlen(s); i++)//将牌放入桶中
b[s[i]]++;
if (b['X'] > 0 && b['D'] > 0)//判断是否存在大小王
flag = 1;
for (int i = 1; i <= 127 && !flag; i++)//判断是否存在炸弹
{
if (b[i] >= 4)
flag = 1;
}
puts(flag ? "Yes" : "No");
}
return 0;
}
C++
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int T, b[128];
cin >> T;
while (T--)
{
memset(b, 0, sizeof(b));//多测清空
bool flag = false;
string s;
cin >> s;
for (int i = 0; i < s.length(); i++)//将牌放入桶中
b[s[i]]++;
if (b['X'] > 0 && b['D'] > 0)//判断是否存在大小王
flag = true;
for (int i = 1; i <= 127 && !flag; i++)//判断是否存在炸弹
{
if (b[i] >= 4)
flag = true;
}
puts(flag ? "Yes" : "No");
}
return 0;
}
「HGOI-1」PMTD
题目背景
uuku \text{uuku} uuku 在学习四则运算!
题目描述
为了验证 uuku \text{uuku} uuku 学习成果, bh1234666 \text{bh1234666} bh1234666 给出一个长为 n n n 整数序列 a i a_i ai。并让 uuku \text{uuku} uuku 给这个序列进行 m m m 次操作。
每次操作可以任意选择序列中一个数 a i a_i ai,令 a i a_i ai 变成 a i + 2 a_i+2 ai+2, a i − 2 a_i-2 ai−2, a i × 2 a_i\times 2 ai×2, ⌊ a i 2 ⌋ \lfloor\frac{a_i}{2}\rfloor ⌊2ai⌋ 这四个结果中的一个。
bh1234666 \text{bh1234666} bh1234666 希望 m m m 次操作后,整个序列的极差(最大值减最小值)最大。
显然 uuku \text{uuku} uuku 没有认真学习,所以他希望你来帮他回答这个问题。
输入格式
第一行两个整数 n n n, m m m。
第二行 n n n 个整数,表示序列 a i a_i ai。
输出格式
共一行一个整数,表示最大的极差。
样例 #1
样例输入 #1
3 2
0 1 0
样例输出 #1
6
提示
样例解释
第一步操作:将 1 1 1 加上 2 2 2 得到 3 3 3。
第二步操作:将 3 3 3 乘以 2 2 2 得到 6 6 6。
极差为 6 − 0 = 6 6-0=6 6−0=6。
数据范围
本题采用捆绑测试,共有 2 2 2 个 subtask \text{subtask} subtask,最终分数为所有 subtask \text{subtask} subtask 分数之和。
KaTeX parse error: \hline valid only within array environment
对于 100 % 100\% 100% 的数据, 2 ≤ n ≤ 1 0 6 2 \le n \le 10^6 2≤n≤106, 1 ≤ m ≤ 10 1 \le m \le 10 1≤m≤10, 0 ≤ a i ≤ 1 0 9 0 \le a_i \le 10^9 0≤ai≤109。
代码如下:
C语言
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int n,val,mx,mn=1e9,m;
int main()
{
scanf("%d%d",&n,&m);
while(n--)
{
scanf("%d",&val);
if(val>mx)mx=val;
if(val<mn)mn=val;
}
if(mx<2)mx+=2,m--;
printf("%lld",((1ll*mx)<<m)-mn);
return 0;
}
C++
#include<cstdio>
#include<iostream>
using namespace std;
int n, val, mx, mn = 1e9, m;
int main()
{
cin >> n >> m;
while (n--)
{
cin >> val;
if (val > mx)mx = val;
if (val < mn)mn = val;
}
if (mx < 2)mx += 2, m--;
printf("%lld", ((1ll * mx) << m) - mn);
return 0;
}