寒假第一次测试题解

目录

A - Rook

1、题目

​编辑

2、思路

3、完整代码

B - Satisfying Constraints

1、题目

2、思路

3、完整代码

C - Sending Messages

1、题目

2、思路

3、完整代码

D - Infinite Replacement

1、题目

2、思路

3、完整代码

E - Also Try Minecraft

1、题目

2、思路

3、完整代码


A - Rook

1、题目

2、思路

固定字母,列举数字(除去输入的数字),固定数字,列举字母(除去输入的字母)

3、完整代码

#include <stdio.h>
int main()
{
	char a;
	char b;
	char arr[10];
	int t;
	scanf("%d", &t);
	getchar();
	while (t--)
	{
		gets(arr);
		a = arr[0];
		b = arr[1];
		for (int i = 1; i <= 8; i++)
		{
			if (b-'0' != i)
			{
				printf("%c%d\n", a, i);
			}
		}
		for (char i = 'a'; i <= 'h'; i++)
		{
			if (a != i)
			{
				printf("%c%c\n", i, b);
			}
		}
	}
	return 0;
}

B - Satisfying Constraints

1、题目

2、思路

根据1得到左区间l,根据2得到右区间r,不断缩小左区间,缩小右区间。区间里面的总个数为r-l;

除去3里在区间内的个数为所求的数

3、完整代码

#include <stdio.h>
int book[110] = { 0 };
int main()
{
	int t;
	scanf("%d", &t);
	int n;
	while (t--)
	{
		scanf("%d", &n);
		int l1, r1;
		l1 = 0;
		r1 = 1000000000;
		int j = 0;
		int sum = 0;
		while (n--)
		{
			int a, x;
			scanf("%d %d", &a, &x);
			if (a == 1 && l1 <= x)
			{
				l1 = x;
			}
			if (a == 2 && x <= r1)
			{
				r1 = x;
			}
			if (a == 3)
			{
				book[j++] = x;
			}
		}
		sum = r1 - l1 + 1;
		if (sum <= 0)
		{
			sum = 0;
			printf("0\n");
			continue;
		}
		if (sum > 0)
		{
			for (int k = 0; k < j; k++)
			{
				if (l1 <= book[k] && book[k] <= r1)
				{
					sum--;
				}
			}
			printf("%d\n", sum);
		}
	}
	return 0;
}

C - Sending Messages

1、题目

2、思路

计算每一段时间所需要消耗的电量和关闭开启所消耗的电量比较,每次取较小的,减去电量,最后总电量大于零,则可能,小于零,则不可能。最好用long long ,不然最后一个用例过不去

3、完整代码

#include <stdio.h>
long long a1[200010] = { 0 };
long long b1[200010];
long long min(long long a2, long long b2)
{
	return a2 < b2 ? a2 : b2;
}
int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		long long n, f, a, b;
		scanf("%lld %lld %lld %lld", &n, &f, &a, &b);
		for (long long j = 1; j <= n; j++)
		{
			scanf("%lld", &a1[j]);
			b1[j] = (a1[j] - a1[j - 1]) * a;
		}
		for (long long i = 1; i <= n; i++)
		{
			long long m = min(b, b1[i]);
			f -= m;
		}
		if (f > 0)
		{
			printf("YES\n");
		}
		else
		{
			printf("NO\n");
		}
	}
	return 0;
}

D - Infinite Replacement

1、题目

2、思路

字符串t分为三种情况,第一种只含有单个字符 ‘ a ’ ,此时只有一种,第二种有2个以上的字符串,包含 ‘ a ’ ,此时有无数多种,因为每替换一次,就会增加一个 ‘a’ ,第三种不含有 ‘a’,此时有2的字符串s字符个数n1的次方个,因为每对应字符串s位置个数有两种可能,根据数学分类计数原理得出结论。

3、完整代码

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

int main()
{
	int t;
	scanf("%d", &t);
	getchar();
	while (t--)
	{
		char s[55];
		char t[55];
		scanf("%s", s);
		scanf("%s", t);
		int n1 = strlen(s);
		int n2 = strlen(t);//个数
		int f = 0;
		for (int i = 0; i < n2; i++)//是否包含'a'
		{
			if (t[i] == 'a')
			{
				f = 1;
				break;
			}
		}
		if (n2 == 1 && f==1)//替换的字符串只有单个'a'的情况
		{
			printf("1\n");
			continue;
		}
		if (n2 >= 2 && f == 1)//包含a
		{
			printf("-1\n");
			continue;
		}
		if (f == 0)
		{
			long long sum = 1;//用long long
			for (int i = 0; i < n1; i++)
			{
				sum *= 2;
			}
			printf("%lld\n", sum);
		}
	}
	return 0;
}

E - Also Try Minecraft

1、题目

2、思路

运用前缀和 和 差分的思想,来预处理,因为选取的区间l,r ,l不一定小于r ,所有得分为两种情况。一个从左到右区间,一个从右到左区间。先用差分,把从1到n之间的数,量量相减(前一个数减去后一个数)如果前一个数大于后一个数存放到b1数组中,否则存放0 ,同理把从n到1之间的数,量量相减(后一个数减去前一个数)如果后一个数大于前一个数存放到b1数组中,否则存放0 。然后运用前缀和,b1从前向后累加,b2从后向前累加。最后同样分为两种情况得出答案,如果l<r,计算b1[r]-b1[l];否则计算 b2[r]-b2[l];

3、完整代码

#include <stdio.h>//前缀和与差分
long long arr[200010] = { 0 };
long long b1[200010] = { 0 };
long long b2[200010] = { 0 };
int main()
{
	int n, m;
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; i++)
	{
		scanf("%lld", &arr[i]);
	}
	for (int i = 1; i <= n; i++)
	{
		if (arr[i - 1] > arr[i])
		{
			b1[i] = arr[i - 1] - arr[i];
		}
		else
		{
			b1[i] = 0;
		}
	}
	for (int i = n; i >= 1; i--)
	{
		if (arr[i + 1] > arr[i])
		{
			b2[i] = arr[i + 1] - arr[i];
		}
		else
		{
			b2[i] = 0;
		}
	}
	for (int i = 1; i <= n; i++)
	{
		b1[i] = b1[i] + b1[i - 1];
	}
	for (int i = n; i >= 1; i--)
	{
		b2[i] = b2[i + 1] + b2[i];
	}
	while (m--)
	{
		int l, r;
		scanf("%d %d", &l, &r);//因为是区间段,所有不需要 r+1 - l 区间
		if (l < r)
		{
			printf("%lld\n", b1[r] - b1[l]);
		}
		else
		{
			printf("%lld\n", b2[r] - b2[l]);
		}
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

エース和

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值