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;
}
标签:AtCoder,return,Beginner,int,ll,后继,242,include,dp 来源: https://www.cnblogs.com/menitrust/p/15971256.html