AtCoder Beginner Contest 242 A-D

A - T-shirt

有一群人,编号1-N,其中某一个人编号为X,在A和A之前的可以获得t恤,在A+1到B的人其中有C个可以获得t恤,给你A B C X,让你求出X获得t恤的概率。

读太快看漏了,以为是A到B其中的人有C个

        double a, b, c, x;
	scanf("%lf%lf%lf%lf", &a,&b,&c,&x);
	double ans = 0;
	if(x<=a)
	{
		ans = 1;
	}
	else if(x>a&&x<=b)
	{
		ans = c / (b - a);
	}
	else
		ans = 0;
	printf("%.12lf",ans);
	return 0;

B - Minimize Ordering

给你一个字符串,输出字典序最小的串
sort

	scanf("%s", s);
	int str = strlen(s);
	sort(s, s + str);
	puts(s);
	return 0;

C - 1111gal password

给你一个数N,找出N位数里有多少个数满足:相邻两位绝对值<=1,且每一位数在1-9之间。

思路:dp[i][j],i表示当前一共有几位数,j表示该数的第一个数,对于i,j,可以发现dp[i][j]=dp[i][j]+dp[i][k] (max(1,j-1)<=k<=min(9,j+1),即j-1到j+1都是相邻的数,所以可以填j。
当时以为是找规律,感觉有点像dp,看完题解发现确实是dp。。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=1e6+10,INF=1e8,mod=998244353;
int dp[N][10];
int main()
{
    for (int i = 1; i <= 9;i++)
        dp[0][i] = 1;//初始化一下,因为a[1][j]=1
    int n;
    scanf("%d", &n);
    for (int i = 1; i < n;i++)
        for (int j = 1; j <= 9;j++)
            for (int k = max(1, j - 1); k <= min(9, j + 1);k++)
            {
                dp[i][j] = (dp[i][j] + dp[i - 1][k]) % mod;
            }
    int ans = 0;
    for (int i = 1; i <= 9;i++)
        ans = (ans + dp[n - 1][i]) % mod;//所有数加起来就是n位数时满足的解
    printf("%d\n", ans);
    return 0;
}

D - ABC Transform

给你一个由A,B,C组成的字符串s0,每次字符串迭代的时候A->BC,B->CA,C->AB,其中A的第1个后继为B,第2个后继为C...有n个询问,每次输入两个数,t,k,输出st的第k个字母

思路:递归,由于s从0开始数,k从1开始数,对齐一下t,k 先让k--,发现字符串每次迭代长度都是乘2的,当k=0的时候就是让你求原字符串的第一个字母迭代t次之后是什么字母,可以发现ABC周期是3,于是只需要返回(s[0]+t)%3即可,当t=0的时候就是原字符串的第k个字符,返回s[k]-'A'。当t,k都不为0时,观察一下,如果当前k是偶数的话,那么它是(t-1,k/2)字母的第一个后继,如果k是奇数的话,那么它是(t-1,k/2)的字母的第二个后继。于是综合一下,对于t,k,返回((t-1,k/2)+k%2+1)%3。如果k是偶数的话那么k%2=0再+1说明它是(t-1,k/2)字母的第一个后继,同理k为奇数它是第二个后继。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=1e5+10,INF=1e8;
char s[N];
int get(ll t,ll k)
{
    if(t==0)
        return s[k] - 'A';
    else if(k==0)
        return (s[0] - 'A' + t) % 3;
    else
        return (get(t - 1, k / 2) + k % 2 + 1) % 3;
}
int main()
{
    scanf("%s", &s);
    int n;
    scanf("%d", &n);
    while(n--)
    {
        ll t, k;
        scanf("%lld%lld", &t, &k);
        k--;
        printf("%c\n", 'A' + get(t, k));
    }
    return 0;
}

posted @ 2022-03-06 11:56  menitrust  阅读(40)  评论(0编辑  收藏  举报