问题C:上进的凡凡
题目链接
思路:
对于子数组定义,只需从头找出非降序的长度,通过ans+=l*(l+1)/2累加,最后得出结果
AC代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5+5;
int a[N];
signed main()
{
int n;
scanf("%d",&n);
for(int i=1; i<=n; ++i) scanf("%d",&a[i]);
int ans=0;
int l=1;
for(int i=1; i<=n; ++i)
{
if(a[i]<=a[i+1]) l++;//计算非递减序列的长度
else {
ans += l*(l+1)/2;
l=1;
}
}
cout << ans << endl;
return 0;
}
问题D:Seek the Joker I
巴什博弈(Bash Game)
问题模型:有一堆物品n,每次至少取一个,至多k个,先取完的获胜。仅需判断n%(k+1),如果为0,先手必败,反之先手必赢。本题思路:判断(n-1)%(k+1),先手取完,对方必败
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--)
{
int n,k;
cin >> n >> k;
if((n-1)%(k+1)!=0) cout << "yo xi no forever!\n";
else cout << "ma la se mi no.1!\n";
}
return 0;
}
问题E:Seek the Joker II
威佐夫博奕(Wythoff Game)
有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多
的物品,规定每次至少取一个,多者不限,最后取光者得胜。
判断差值x,是不是满足:(sqrt(5)+1)/2*x==min(n1,n2);
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--)
{
int n,x;
cin >> n >> x;
double s=(sqrt(5)+1)/2;
int n1=x-1,n2=n-x;
if(n1>n2) swap(n1,n2);
if((int)((double)(n2-n1)*s) != n1) cout << "yo xi no forever!\n";
else cout << "ma la se mi no.1!\n";
}
return 0;
}
总结:
- 了解了两种博弈