标签:task pre for ada com info nbsp tor 概率
如果这次交换能够使得这个人手上的牌的点数的期望变大,他就会选择交换(只考虑这次交换,不考虑之后的人的情况)。四个人互相知道他们所有人都使用了这个策略。
题意四个人四张牌, 然后给你 第四个人手上的牌 和 第二个人、第三个人是否与前面的人换牌, 问第四个人要不要换牌
然后可以根据交换的策略直接枚举
先枚举第二个人的情况
1 Y 如果第二个人手中牌为1,那么他前面这张牌有 1/3 的概率是 2、3、4 期望为(2+3+4)/3=3 > 1 所以第二个人换牌
2 Y 如果第二个人手中牌为2,那么他前面这张牌有 1/3 的概率是 1、3、4 期望为(1+3+4)/3=8/3 > 2 所以第二个人换牌
3 N 如果第二个人手中牌为3,那么他前面这张牌有 1/3 的概率是 1、2、4 期望为(1+2+4)/3=7/3 < 3 所以第二个人不换牌
4 N 如果第二个人手中牌为4,那么他前面这张牌有 1/3 的概率是 1、2、3 期望为(1+2+3)/3=2 < 4 所以第二个人不换牌
再枚举第三个人的情况
1 如果第三个人手中牌为1, 然后枚举第二个人是否换牌和第三个人的情况
YY 如果第二个人换牌 那么第二个人手上的牌是1或2,第三个人手上牌是1 所以第二个人手上牌只能是2 namo第一张牌有1/2的概率是3、4 期望为(3+4)/2=7/2 > 1 所以第三个人换牌
NY 如果第二个人不换牌 那么第二个人手上的牌是3或4,第三个人手上牌是1 namo第二张牌有1/2的概率是3、4 namo 期望为(3+4)/2=7/2 > 1 所以第三个人换牌
2 如果第三个人手中牌为2,
YY 如果第二个人换牌 那么第二个人手上的牌是1或2,第三个人手上牌是2 所以第二个人手上牌只能是1 namo第一张牌有1/2的概率是3、4 期望为(3+4)/2=7/2 > 2 所以第三个人换牌
NY 如果第二个人不换牌 那么第二个人手上的牌是3或4,第三个人手上牌是2 namo第二张牌有1/2的概率是3、4 namo 期望为(3+4)/2=7/2 > 2 所以第三个人换牌
3 如果第三个人手中牌为3,
YN 如果第二个人换牌 那么第二个人手上的牌是1或2,namo第二张牌有1/2的概率是牌以后变成4 1/4的概率是1、2 期望为(1+2)/4+4/2=11/4 < 3 所以第三个人不换牌
NY 如果第二个人不换牌 那么第二个人手上的牌是3或4,第三个人手上牌是3 那第二个人手上牌是4 namo一定要换 所以第三个人换牌
4 如果第三个人手中牌为4, namo坚决不换 换了以后以后会变小
NN
YN
然后来枚举第四个人的情况(根据之前的第三个人情况枚举)
如果第四个人手里牌是1 如果第四个人手里牌是2 如果第四个人手里牌是3 如果第四个人手里牌是4
NN 第三个人为4,第二个人为3 namo换 namo换 namo不可能 namo不可能
NY 第三个人可能为1、2、3,第二个人为3 、4 namo换 namo 换 namo换 namo不换
YY 第二个人第三个人为 1或2 namo不可能 namo不可能 namo换 namo不换
YN 第二个人为1或2 第三个人为3或4 namo换 namo换 namo换 namo不换
B 嬲 Time limit: 1500ms Memory limit: 262144k
两种情况一种是能刷无限条命 一种是不能
能刷无限条命的情况就是能构成一个环 环长度大于等于k,可以模拟得到最长的环应该是每隔两个位置跳 不能跳时再跳回来
不能刷无限次命的情况就是找一条能跳的最大链
#include<bits/stdc++.h> using namespace std; #define ll long long #define _for(i,a,b) for(int i = (a); i < (b); i++) #define _rep(i,a,b) for(int i = (a); i <= (b); i++)
void taskA() { int x; cin >> x; string s; cin >> s; if(((x==1 or x==2) and s == "YY") or (x==3 and s == "NN")) cout << "Impossible\n"; else if(x == 4) { if(s == "NN") cout << "Impossible\n"; else cout << "N\n"; } else cout << "Y\n"; return; }
void taskB() { int t; cin >> t; while(t--) { int n,k; ll x; cin >> n >> x >> k; vector<ll> a(n), dp(n,1); _for(i,0,n) cin >> a[i]; _for(i,1,n) if(a[i]-a[i-1] <= x) dp[i]++; ll ma = n>1 ? dp[1] : 1; _for(i,2,n) { if(a[i]-a[i-2] <= x) dp[i] = (dp[i-1]+1); ma = max(ma, dp[i]); } if(ma >= k) {cout << "niao!\n";} else { _for(i,1,n) { if(a[i]-a[i-1] <= x) dp[i] = dp[i-1]+1; ma = max(ma, dp[i]); } cout << ma << "\n"; } } return; }
int main() { //taskA(); taskB(); return 0; }
标签:task pre for ada com info nbsp tor 概率
原文地址:https://www.cnblogs.com/163467wyj/p/13375068.html