洛谷刷题C语言:FILIP、修改数组、Fun、Šifra、Erinnerung

记录洛谷刷题QAQ


[COCI2009-2010#3] FILIP

题目描述

给你两个十进制正整数 a , b a, b a,b,输出将这两个数翻转后的较大数。

「翻转」在本题中的定义详见「说明 / 提示」部分。

输入格式

第一行,两个十进制正整数 a , b a, b a,b

输出格式

第一行, a a a b b b 翻转后的较大数。

样例 #1

样例输入 #1

734 893

样例输出 #1

437

样例 #2

样例输入 #2

221 231

样例输出 #2

132

样例 #3

样例输入 #3

839 237

样例输出 #3

938

提示

「翻转」在本题中的定义

设原数有 f f f 位,最高位为 a 1 a_1 a1,第二位为 a 2 a_2 a2,……,第 f f f 位为 a f a_f af

那么该数的翻转同样有 f f f 位,最高位为为 a f a_f af,第二位为 a f − 1 a_{f - 1} af1,……,第 f f f 位为 a 1 a_1 a1

数据规模及约定

对于 100 % 100\% 100% 的数据, 100 ≤ a , b ≤ 999 100 \le a, b \le 999 100a,b999 a , b a, b a,b 不含 0 0 0 或不为 0 0 0

说明

翻译自 COCI 2009-2010 #3 T1 FILIP,满分 30,每个测试点 3 分,共 10 个测试点。

代码如下

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>

int main()
{
	char a[100], b[100];
	scanf("%s%s",&a,&b);
	
	int len1 = strlen(a);
	int len2 = strlen(b);
	
	int a1 = 0;
	for(int i = len1 -1;i >= 0;i--)
	{
		a1 = a1 + (a[i] - '0')*pow(10,i);
//		printf("%d\n",a1);
	}
	int b1 = 0;
	for(int i = len1 -1;i >= 0;i--)
	{
		b1 = b1 + (b[i] - '0')*pow(10,i);
//		printf("%d\n",b1);
	}
	
	if(a1 > b1)
	{
		printf("%d\n",a1);
	}
	else
		printf("%d\n",b1);
	return 0;
}

「EZEC-5」修改数组

题目描述

给定一个长度为 n n n、元素由 0 0 0 1 1 1 组成的数组。

现在可以选择若干(可以为 0)个值为 0 0 0 的元素,将其修改为 1 1 1

记:

  • x x x 为数组中最长连续 1 1 1 子段的长度(规定,若所有数均为 0 0 0,则 x x x 0 0 0);
  • y y y 为修改的元素的个数。

求要怎么修改才能使 x − y x-y xy 最大,并构造一个方案(输出修改后的数组)。

输入格式

本题含有多组数据。

第一行一个整数 T T T 表示数据组数。

接下来 2 × T 2\times T 2×T 行,每 2 2 2 行表示一组数据。

在一组数据中,第一行一个整数 n n n,表示数组的长度;

第二行 n n n 个整数(0 或 1),表示给定的数组。

输出格式

2 × T 2\times T 2×T 行,每 2 2 2 行表示一组数据。

在一组数据中,第一行输出一个整数表示 x − y x-y xy 的最大值;

第二行 n n n 个整数(0 或 1)表示修改以后的数组。如有多个方案,任意输出一种即可。

样例 #1

样例输入 #1

1
1
1

样例输出 #1

1
1

样例 #2

样例输入 #2

2
3
1 0 1
5
0 1 0 1 0

样例输出 #2

2
1 1 1
2
0 1 1 1 1

提示

本题采用捆绑测试。

对于所有数据,保证 T ≤ 10 , 1 ≤ n ≤ 1 0 5 T\le10,1\le n\le 10^5 T10,1n105,数组元素 ∈ { 0 , 1 } \in \{0,1\} {0,1}

  • Subtask 1(70 points):保证 1 ≤ n ≤ 10 1\le n\le 10 1n10
  • Subtask 2(30 points):无特殊限制。

代码如下

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>

int main()
{
	int n;
	scanf("%d",&n);
	while(n--)
	{
		int len;
		scanf("%d",&len);
		int num[len];
		int sum = 0;
		for(int i = 0;i < len;i++)
		{
			scanf("%d",&num[i]);
			if(num[i] == 1)
				sum++;
		}
		
		printf("%d\n",sum);
		for(int i = 0;i < len;i++)
		{
			printf("1 ");
		}
		printf("\n");
	}
	return 0;
}

『MdOI R4』Fun

题目背景

去 NOIP 考场时有两个优良传统:打狼和喝快乐水。这两项活动都能给同学们带来快乐。

题目描述

VG 的学校有 n n n 个人要去考 NOIP。

每个人有一个交通方式,第 i i i 个人的交通方式为 t i t_i ti t i = 1 t_i=1 ti=1 表示这个人坐学校大巴, t i = 0 t_i=0 ti=0 表示这个人自己去考场。

每个人有一个颓废值,第 i i i 个人的颓废值为 q i q_i qi q i = 1 q_i=1 qi=1 表示这个人愿意打狼, q i = 0 q_i=0 qi=0 表示这个人不愿意打狼。

每个人去考场时会买一瓶快乐水,但如果坐大巴且愿意打狼的人数(即满足 t i = 1 t_i=1 ti=1 q i = 1 q_i=1 qi=1 i i i 个数) k k k 不小于 m m m,则这 k k k 个人只需要买 m m m 瓶快乐水。

现在,VG 统计出了所有人的交通方式和颓废值,他请你帮他求出最终所有人买快乐水的总瓶数。

输入格式

第一行三个整数 n , m , t y p e n,m,type n,m,type。其中 t y p e type type 表示特殊限制编号,具体意义见数据范围。它可能可以帮助你获得部分分,但正解不依赖于此。

第二行 n n n 个整数,第 i i i 个整数为 t i t_i ti

第三行 n n n 个整数,第 i i i 个整数为 q i q_i qi

输出格式

一行一个整数,表示所有人最终买的快乐水总瓶数。

样例 #1

样例输入 #1

3 1 3
1 0 1
0 1 1

样例输出 #1

3

样例 #2

样例输入 #2

3 1 3
1 1 1
0 1 1

样例输出 #2

2

提示

【样例解释 #1】

三个人的情况如下:

  • 1 1 1 个人乘坐大巴但不打狼;

  • 2 2 2 个人打狼但不乘坐大巴;

  • 3 3 3 个人乘坐大巴而且打狼。

所以,只有 1 1 1 个人既乘车又打狼,满足不小于 m m m 的条件,故对于这 1 1 1 个人需要购买 m m m 瓶快乐水,剩下 2 2 2 个人购买 2 2 2 瓶快乐水,总共须购买 3 3 3 瓶快乐水。

【数据规模与约定】

本题不采用捆绑测试

测试点编号 n , m n,m n,m t y p e type type t i t_i ti q i q_i qi
1 1 1 ≤ 30 \le 30 30 = 0 =0 =0 = 0 =0 =0 = 0 =0 =0
2 2 2 ≤ 70 \le 70 70 = 0 =0 =0 = 0 =0 =0 = 0 =0 =0
3 3 3 ≤ 30 \le 30 30 = 1 =1 =1 = 1 =1 =1 = 1 =1 =1
4 4 4 ≤ 70 \le 70 70 = 1 =1 =1 = 1 =1 =1 = 1 =1 =1
5 5 5 n = m n=m n=m = 2 =2 =2无特殊限制无特殊限制
6 6 6 n = m n=m n=m = 2 =2 =2无特殊限制无特殊限制
7 7 7 n = m n=m n=m = 2 =2 =2无特殊限制无特殊限制
8 8 8无特殊限制 = 3 =3 =3无特殊限制无特殊限制
9 9 9无特殊限制 = 3 =3 =3无特殊限制无特殊限制
10 10 10无特殊限制 = 3 =3 =3无特殊限制无特殊限制

对于 100 % 100\% 100% 的数据, 1 ≤ m ≤ n ≤ 100 1 \le m \le n \le 100 1mn100 t i , q i ∈ { 0 , 1 } t_i,q_i \in \{0,1\} ti,qi{0,1} t y p e ∈ { 0 , 1 , 2 , 3 } type \in \{0,1,2,3\} type{0,1,2,3}

代码如下

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>

int main(){
    int n,m,type,sum=0;
    scanf("%d%d%d",&n,&m,&type); 
    int a[10001],b[10001];
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++) scanf("%d",&b[i]);
    for(int i=1;i<=n;i++)
        if(a[i]==b[i]&&a[i]==1) sum++;//输入之后判断 a_i=1 的个数
    if(sum>m) printf("%d",m+n-sum);
    else printf("%d",n);
    return 0;
}

[COCI2020-2021#5] Šifra

题目描述

给定一个长度不超过 100 100 100 的只包含小写字母和 0 ∼ 9 0 \sim 9 09 字符的字符串(字符串中的字母可视为分隔符)。求字符串中包含多少个不同的数。

输入格式

一行只包含小写字母和 0 ∼ 9 0 \sim 9 09 字符的字符串,保证每个数最多有 3 3 3 位。

输出格式

输出字符串中不同数的数量。

样例 #1

样例输入 #1

abc123abc2a3a1

样例输出 #1

4

样例 #2

样例输入 #2

borna123vitez

样例输出 #2

1

样例 #3

样例输入 #3

as23dkrf23smk1asd23sam9

样例输出 #3

3

提示

数据规模与约定

对于 50 % 50\% 50% 的数据,所有出现的数都互不相同。

对于 100 % 100\% 100% 的数据,字符串的长度在 1 1 1 100 100 100 之间。

说明

本题分值按 COCI 原题设置,满分 50 50 50

题目译自 COCI2020-2021 CONTEST #5 T1 Šifra

代码如下

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>

int vis[1001];
char in[10000];
int num,flag;
int main()
{
    scanf("%s",&in);  //读入字符串
    int len=strlen(in);  //字符串长度
    for(int i=0;i<len;i++)
    {
        if(in[i]>='0'&&in[i]<='9')  //如果正在处理的这一位是数字
        {
            num=num*10+in[i]-'0';//将数字进行处理
            flag=1;  //flag=1 表示这一位是数字
        }
        else if(flag==1) //如果正在处理的这一位是字母且上一位是数字
            {
                flag=0;//标记这一位不是数字
                vis[num]=1;//标记这一个数字出现过
                num=0;//将处理的数字清空
            }
    }
    if(flag==1)
        vis[num]=1;//如果最后一位是数字也进行处理
    int ans=0;
    for(int i=0;i<=1000;i++)
        if(vis[i])//计算出现过的数字
            ans++;
    printf("%d",ans);//输出
    return 0;
}

「EZEC-7」Erinnerung

题目背景

我希望,
我们能留下存在过的痕迹,
然后优雅地离去,
无声地消逝。
我回想,
我们共同拥有的那些记忆:
我们随金色的落叶而聚,
又同白色的雪花而去。
或许什么也没有留下,
就要空手而归。
但我不必恐惧,
不需如此匆忙。
因为那些落叶和雪花,
永远地保存着,
我们书写的故事,
和无比珍贵的回忆。
—— lgswdn

题目描述

小 Y 和小 Z 都是生活在 Arcaea Offline 的精灵。小 Y 有无数片落叶,其中第 i i i 片落叶的价值为 C i C_i Ci。小 Z 有无数片雪花,其中第 i i i 片雪花的价值为 E i E_i Ei。经过小 X 的仔细观察,他发现 C C C E E E 满足特殊的条件:

C i = { x × i ( x × i ≤ K ) − K otherwise C_i= \begin{cases} x\times i& (x\times i\le K)\\ -K& \text{otherwise} \end{cases} Ci={x×iK(x×iK)otherwise
E i = { y × i ( y × i ≤ K ) − K otherwise E_i= \begin{cases} y\times i& (y\times i\le K)\\ -K& \text{otherwise} \end{cases} Ei={y×iK(y×iK)otherwise

小 Y 和小 Z 可以对这些落叶和雪花进行一些操作。每次,他们会选择满足价值之和 ≥ K \ge K K 的一片落叶和一片雪花,然后让把它们一同组成一段彩色的回忆(Erinnerung)。之后,这片雪花和这片落叶就消失不见了,之后的操作也不能再用到这片雪花和落叶了。

小 X 想知道,他们最多能进行多少次操作。

输入格式

本题有多组数据。

第一行一个整数 T T T,表示数据的组数。

接下来 T T T 行,每行三个非负整数 x , y , K x,y,K x,y,K

输出格式

对于每组数据,输出一个整数,代表最多能有多少次操作。每组数据的答案用一个换行符隔开。

样例 #1

样例输入 #1

2
2 3 10
2 4 11

样例输出 #1

3
2

样例 #2

样例输入 #2

1
0 0 1

样例输出 #2

0

提示

【样例解释】

对于样例 1 的第一组数据,落叶的价值为 2 , 4 , 6 , 8 , 10 , − 10 , − 10 … 2,4,6,8,10,-10,-10\dots 2,4,6,8,10,10,10 ,雪花的价值为 3 , 6 , 9 , − 10 , − 10 … 3,6,9,-10,-10\dots 3,6,9,10,10 。第一次操作选取第 4 4 4 片落叶和第 1 1 1 片雪花,价值和为 11 11 11。第二次操作选取第 2 2 2 片落叶和第 2 2 2 片雪花,价值和为 10 10 10。第三次操作选取第 5 5 5 片落叶和第 3 3 3 片雪花,价值和为 19 19 19。如是,可以进行 3 3 3 次操作。容易证明不存在更优的解。

对于第二组数据,进行的两次操作可以为:选取第 4 4 4 片落叶和第 1 1 1 片雪花,以及选取第 2 2 2 片落叶和第 2 2 2 片雪花。

对于样例 2,所有的雪花和落叶的价值都为 0 0 0,不可能找到落叶和雪花使其和 ≥ 1 \ge 1 1


【数据范围】

  • Subtask 1(30 points): x , y , K , T ≤ 10 x,y,K,T\le 10 x,y,K,T10
  • Subtask 2(70 points):无特殊限制。

对于 100 % 100\% 100% 的数据,满足 0 ≤ x , y ≤ 1 0 10 0\le x,y\le 10^{10} 0x,y1010 1 ≤ K ≤ 1 0 10 1\le K\le 10^{10} 1K1010 1 ≤ T ≤ 1 0 5 1\le T\le 10^5 1T105

代码如下

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
#define int unsigned long long 

int max(int a, int b)
{
	if(a > b)
		return a;
	else
		return b;
}

int min(int a, int b)
{
	if(a > b)
		return b;
	else
		return a;
}
int t;
long long x, y, k;

int main()
{
    scanf("%d", &t);
    while(t --)
    {
        scanf("%lld%lld%lld", &x, &y, &k);
        if(x == 0 && y == 0)
        {
            printf("0\n");
            continue;
        }
        else if(x == 0 || y == 0)
        {
            if(k % max(x, y) == 0)printf("1\n");
            else printf("0\n");
            continue;
        }
        printf("%lld\n", min(k / x, k / y));
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值