1. 程式人生 > 其它 >AtCoder Beginner Contest 242 A-D

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