零点工作室暑假集训(AtCoder--ABC242)

A - T-shirt

题意: 在某个编程比赛中,根据以下规则向参赛者发放T恤衫。所有排名在第A名或更高的参赛者都会获得一件T恤。此外,在排名在第(A+1)名到第B名(包括A+1和B)之间的参赛者中,随机选择C名参赛者可以获得一件T恤。选择是均匀随机的。这次比赛中,共有1000名参赛者,且他们的排名各不相同。伊罗哈参加了这次比赛,她的排名是第X名。求她获得T恤的概率。

思路:直接if判断即可要不就输出1,要不就是0,要不就是概率事件

AC代码

#include<bits/stdc++.h>

using namespace std;

typedef long long LL;

const int N = 1010, INF = 0x3f3f3f3f, Mod = 998244353;
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, -1, 0, 1};

int n;
map<int, int> mp;
bool st[N];
int a, b, c, x;

int main()
{
    cin >> a >> b >> c >> x;
    if(x <= a) cout << 1.000000000000;
    else if(x > b) cout << 0;
    else
    {
        //cout << (double)c / (b - a);
        printf("%.12lf", (double)c / (b - a));
    }
    
    
    return 0;
}

B - Minimize Ordering

题意: 给定一个字符串S,找到通过对S的字符进行排列得到的字典序最小的字符串S’。这里,对于两个不同的字符串s = s1s2 … sn和t = t1t2 … tm,当满足以下条件之一时,s在字典序上小于t:
存在一个整数i(1≤i≤min(n, m)),使得si < ti,并且对于所有整数j(1≤j<i),都有sj = tj。
对于所有整数i(1≤i≤min(n,m)),都有si = ti,并且n < m。

思路:需要通过对字符串S进行字符排列来创建一个字典序最小的字符串S’。所以直接sort排序在输出即可

AC代码

#include<bits/stdc++.h>

using namespace std;

typedef long long LL;

const int N = 1010, INF = 0x3f3f3f3f, Mod = 998244353;
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, -1, 0, 1};

int n;
map<int, int> mp;
bool st[N];
string s;

int main()
{
    cin >> s;
    sort(s.begin(), s.end());
    cout << s;
    
    return 0;
}

C - 1111gal password

题意: 给定一个整数N,找出满足以下所有条件的整数X的数量,取模为998244353。
X是一个N位正整数。
设X1, X2, …, XN是X从高位到低位的数字。它们满足以下所有条件:

  1. 对于所有整数1≤i≤N,有1≤Xi≤9;
  2. 对于所有整数1≤i≤N-1,有|Xi-Xi+1|≤1。

思路: 可以使用动态规划来计算满足条件的整数X的数量。定义一个二维数组dp,其中dp[i][j]表示i位数的整数,最后一位为j的整数的数量。初始时,仅有一位数的整数的数量为1,即dp[1][j]=1,其中1≤j≤9。然后,根据题目给出的条件进行递推计算。对于每个位数i(2≤i≤N),可以根据前一位的数字和当前位的数字之间的关系,计算出当前位的数字的数量

AC代码

#include <bits/stdc++.h>

using namespace std;

const int N = 1000010, mod = 998244353;;

typedef long long LL;

LL dp[N][10];
LL n;

int main() 
{
    cin >> n;
    dp[2][1] = 2;
    for (int i = 2; i <= 8; i ++) 
    {
        dp[2][i] = 3;
    }
    dp[2][9] = 2;
    for (int i = 3; i <= n; i ++) 
    {
        for (int j = 1; j <= 9; j ++) 
        {
            if (j == 1) dp[i][j] = (dp[i - 1][1] + dp[i - 1][2]) % mod;
            else if (j == 9) dp[i][j] = (dp[i - 1][8] + dp[i - 1][9]) % mod;
            else dp[i][j] = (dp[i - 1][j - 1] + dp[i - 1][j] + dp[i - 1][j + 1]) % mod;
        }
    }
    
    LL ans = 0;
    
    for (int i = 1; i <= 9; i ++) 
    
    {
        ans += (dp[n][i]) % mod;
    }
    cout << (ans) % mod;
    
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值