"蔚来杯"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;
}