Namomo Cockfight Round 3 ab

传送门

A Poker  Time limit: 1000ms Memory limit: 262144k (wls视频讲解地址

如果这次交换能够使得这个人手上的牌的点数的期望变大,他就会选择交换(只考虑这次交换,不考虑之后的人的情况)。四个人互相知道他们所有人都使用了这个策略。

题意四个人四张牌, 然后给你 第四个人手上的牌 和  第二个人、第三个人是否与前面的人换牌, 问第四个人要不要换牌

然后可以根据交换的策略直接枚举

先枚举第二个人的情况

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不换  

                                           

嬲 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
";
    else if(x == 4) {
        if(s == "NN") cout << "Impossible
";
        else cout << "N
";
    }
    else    cout << "Y
";
    return;
}
View A Code
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!
";}
        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 << "
";
        }
    }
    return;
}
View B Code
int main() {
    //taskA();
    taskB();
    return 0;
}
原文地址:https://www.cnblogs.com/163467wyj/p/13375068.html