目录
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;
}