洛谷刷题C语言:Fergusonball Ratings、Don‘t Mozheng. /oh、gcd.、幻想乡扑克游戏、PMTD

63 篇文章 7 订阅
17 篇文章 1 订阅

记录洛谷刷题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×ai3×bi

如果第 i i i 个人的分数大于 40 40 40 ,那么这个人就是一个黄金球员。

相对应的,如果这个球队的所有人都是黄金球员,那么这个球队就是一个黄金球队。

输入格式

第一行一个整数 n n n ,表示球队的人数。

接下来 2 n 2n 2n 行,第 2 i − 1 2 i - 1 2i1 行表示 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 1n20,1ai,bi2000

代码如下

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/ /,不含两边的尖角括号):

  1. 形如 < str >: \texttt<\textit{str}\texttt{>:} <str>:。意为接下来一行的一条信息是名为 s t r str str 的用户发的。
  2. 形如 /< s t r > \texttt{/<}str\texttt> /<str>。意为一条名称为 s t r str str表情信息
  3. 形如 < 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} Subtask1234n10100无特殊限制无特殊限制特殊性质A分值20202040

  • 特殊性质 A \text{A} A:输入不含有第 3 类信息。

对于 100 % 100\% 100% 的数据,有 1 ≤ n ≤ 1 0 4 1\le n\le 10^4 1n104 1 ≤ l ≤ 50 1\le l\le 50 1l50 1 ≤ a , b ≤ 1 0 3 1\le a,b\le 10^3 1a,b103

代码如下

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 rl105
  • 对于上述的前 40 % 40\% 40% 的数据, 1 ≤ x ≤ l ≤ r ≤ 1 0 9 1 \leq x \leq l \leq r \leq 10^9 1xlr109
  • 对于所有数据, 1 ≤ x ≤ l ≤ r ≤ 1 0 18 1 \leq x \leq l \leq r \leq 10^{18} 1xlr1018 1 ≤ T ≤ 10 1 \leq T \leq 10 1T10

代码如下

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 代表你不应该叫地主。
  • 你可以输出字符串的任意大小写形式。例如:字符串 yesYesYES 均会被视为表示应该叫地主。

样例 #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 1T104保证牌已经预先理好

代码如下

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 ai2 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 60=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 2n106 1 ≤ m ≤ 10 1 \le m \le 10 1m10 0 ≤ a i ≤ 1 0 9 0 \le a_i \le 10^9 0ai109

代码如下

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值