"蔚来杯"2022牛客暑期多校训练营1

"蔚来杯"2022牛客暑期多校训练营1

真的罚坐啊www,痛,太痛了。

D

题意

一个圆内有一条线段,线段可以绕一个轴转,保证转出来的圆在园内。求从线段两端点做两和线段垂直的射线,两射线的和大圆的交出的圆弧最长。

思路

感觉纯猜的,没什么思路,画图找特殊点发现当圆心,线段两端点,转轴共线时取到答案。

代码也好写(听说向量写法会卡精度)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<map>
#include<stack>
#include<string>
#include<random>
#include<iomanip>
#define yes puts("yes");
#define inf 0x3f3f3f3f
#define ll long long
#define linf 0x3f3f3f3f3f3f3f3f
#define ull unsigned long long
#define endl '\n'
#define int long long
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
using namespace std;
mt19937 mrand(random_device{}());
int rnd(int x) { return mrand() % x;}
typedef pair<int,int> PII;
const int MAXN =10 + 2e5 ,mod=1e9 + 7;
#define db long double  
db PI;
void solve()
{    
    int r,x,y; cin >> r >> x >> y;
    int d; cin >> d;
    db p = 2. * d * sqrt(r * r - d * d) / (1. * r * r);
    db ans1 = asin(p) * r;
    
    db dis = sqrt(x * x + y * y);
    db d1 = dis - d, d2 = dis + d;
    db t1 = acos(d1 / r), t2 = acos(d2 / r);
    db ans2 = (t1 - t2) * r;
    cout << fixed << setprecision(12);
    cout << max(ans1,ans2) << endl;
}
signed main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    db PI = acos(-1);

    int T;cin>>T;
    while(T--)
        solve();

    return 0;
}

I

题意

打牌,共34张牌,每种4张,共136张。初始手牌13张,保证手牌中同种牌最多2张,每次从牌堆抽一张,此时手牌14张,按 最优策略 扔一张,当凑出七对子时胜利。问获胜期望,对 \(1000000009\) 取模。

思路

最优策略还挺好想的,抽出来有用就凑对并扔个单,没用就把它扔了。

考虑dp。定义 \(dp[i][j]\) 表示牌堆有 \(i\) 张牌,手里 \(j\) 张单的胜利期望轮数。\(dp[0][0]=0\) 显然已经胜利,还需轮数为0。\(dp[136-13][t]\) 为答案。

考虑转移,当抽出一张牌后有两种情况。

  • 抽出有用牌,可以凑一对扔一单,因此转移向 \(f[i-1][j-2]\)
  • 抽出无用牌,直接扔了,转向 \(f[i-1][j]\)

考虑两种情况概率,抽出有用牌:手上 \(j\) 张单,牌堆里就有 \(3*j\) 张单,概率就是 $ \frac{3j}{i}$ 。无用牌(包括抽出已经成对的牌,手上没有的单牌): \(1-\frac{3j}{i}\)

因为 \(dp[0][0]\) 是初始态,因此dp倒着转移。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<map>
#include<stack>
#include<string>
#include<random>
#include<iomanip>
#define yes puts("yes");
#define inf 0x3f3f3f3f
#define ll long long
#define linf 0x3f3f3f3f3f3f3f3f
#define ull unsigned long long
#define endl '\n'
#define int long long
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
using namespace std;
mt19937 mrand(random_device{}());
int rnd(int x) { return mrand() % x;}
typedef pair<int,int> PII;
const int MAXN =10 + 2e5 ,mod=1e9 + 7;
int f[200][20];
int ksm(int a,int b) {
    int ans = 1;
    while(b) {
        if(b & 1) ans = ans * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return ans;
}
int inv(int x){return ksm(x,mod - 2);}
void init(){
    for(int i = 1;i <= 136 - 13;i += 1) {
        for(int j = 1;j <= 13;j += 1) if(i - 3 * j >= 0) {
            if(j == 1) 
                f[i][j] = 1 + (i - 3 * j) * inv(i) % mod * f[i - 1][j] % mod;
            else 
                f[i][j] = 1 + (i - 3 * j) * inv(i) % mod * f[i - 1][j] % mod + 
                3 * j * inv(i) % mod * f[i - 1][j - 2] % mod;
            f[i][j] %= mod;
        }
    }
}
int cs;
void solve()
{    
    int t = 0;
    string s; cin >> s;
    map<string,int> mp;
    for(int i = 0;i < s.size();i += 2) {
        mp[s.substr(i,2)] += 1;
    }
    for(auto [x,y] : mp) if(y == 1) t += 1;
    cout << "Case #" << ++cs << ": " << f[136 - 13][t] << endl;
}
signed main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    init();
    int T;cin>>T;
    while(T--)
        solve();

    return 0;
}
posted @ 2022-07-20 19:38  Mxrurush  阅读(19)  评论(0编辑  收藏  举报