1. 程式人生 > 實用技巧 >Namomo Cockfight Round 3 ab

Namomo Cockfight Round 3 ab

傳送門

A PokerTime limit: 1000msMemory 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不換

BTime limit: 1500msMemory 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;
}
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!\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;
}
View B Code

int main() {
    //taskA();
    taskB();
    return 0;
}