【博弈论】题目积累

【博弈论】题目积累

代码都很简单
思路一般也很简单()
不要多想()

乘之

https://ac.nowcoder.com/acm/contest/100671/D

代码

/*【博弈论】
小龙防止小蛇乱来 所以要全选(x
正贡献一定会被小龙选
负贡献一定会被小蛇选
->所有都要选
*/
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef pair<int,int> PII;
typedef long long ll;
ll abss(ll a){return a>0?a:-a;}
ll max_(ll a,ll b){return a>b?a:b;}
ll min_(ll a,ll b){return a<b?a:b;}
bool cmpll(ll a,ll b){return a>b;}
const int N=100010;
int t;
int n,k;
int a[N];
void solve(){
      cin>>n>>k;
      for(int i=1;i<=n;i++) cin>>a[i];
      ll sum=0;
      for(int i=1;i<=n;i++) sum+=a[i]*k;
      cout<<sum<<endl;
}
signed main(){
      ios::sync_with_stdio(0);
      cin.tie(0);
      cout.tie(0);
      cin>>t;
      while(t--){solve();}
      return 0;
}

Hamiiid, Haaamid... Hamid?

https://codeforces.com/contest/2127/problem/B
分析先后手行动答案造成的影响
处理边界问题

题目大意

14c93e65-108a-45ba-94b2-380f792431d6
5d1c48bf-42fb-4b49-a2ee-784e8688d759

思路

65446fbb-fa9b-423a-ad9a-4046ed3910ca

代码

int x,n;
string s;
/*
首先考虑不放墙的方案:min(le+1,n-ri+2)->可以直接反手走 之后一直堵
考虑放墙:【注意这里是*先*放墙】
那么左边和右边*只能*最大化一个
*/
void solve(){
    cin>>n>>x;
    cin>>s;
    s=' '+s;
    int le=-inf_int,ri=inf_int;
    for(int i=x-1;i>=1;i--){
        if(s[i]=='#'){
            le=i;
            break;
        }
    }
    for(int i=x+1;i<=n;i++){
        if(s[i]=='#'){
            ri=i;
            break;
        }
    }
    //注意边界问题!
    if(x==1 || x==n){
    	cout<<1<<endl;
    	return;
    }
    if(le==-inf_int && ri==inf_int){
        cout<<1<<endl;
    }
    else{
    	//先手放的希望天数越多越好->取max
    	//里面是后手,希望天数越少越好->取min
    	//cout<<min(x,n-ri+2)<<" "<<min(le+1,n-x+2)<<endl;
        int ans=max(min(x,n-ri+2),min(le+1,n-x+1));
        cout<<ans<<endl;
    }
}
posted @ 2025-01-25 21:47  White_ink  阅读(12)  评论(0)    收藏  举报