AtCoder Beginner Contest 242 A-D
阿新 • • 發佈:2022-03-06
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;
}