【博弈论】题目积累
【博弈论】题目积累
代码都很简单
思路一般也很简单()
不要多想()
乘之
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
分析先后手行动对答案造成的影响
处理边界问题
题目大意
思路
代码
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;
}
}