2024牛客寒假算法基础集训营3(B、D)

B、智乃的数字手串

题目:

2024牛客寒假算法基础集训营3(B、D)_第1张图片

解题思路:(博弈论)

n=1时,必然是qcjj赢;(必胜态)

n=2时,无论是奇数还是偶数,qcjj必输;(必败态)

n=3时,qcjj可以取出一个数将其转换为n=2时的状态,这对zn来说必输;(必胜态)

n=4时,同样可以转换到n=3时的转态······

总结得到n是奇数时,qcjj赢;n是偶数时,zn赢。

代码如下:

#include 
#include 
#define int long long
#define endl '\n'
using namespace std;
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t,n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        int a[30];
        for(int i=1;i<=n;i++)
            cin>>a[i];
        if(n%2==0)cout<<"zn"<

D、chino's bubble sort and maximum subarray sum(easy version)

题目:

2024牛客寒假算法基础集训营3(B、D)_第2张图片

2024牛客寒假算法基础集训营3(B、D)_第3张图片

解题思路:

此题数组的顺序是一定的,当k=1时,只有相邻的两个元素可以交换。求最大子段和,我看了一下方法有很多,当然复杂度越小越好。

(求最大子段和的方法可以参考:连续子数组的最大和问题(五种解法)-CSDN博客)

代码如下:

#include 
#include 
#define int long long
#define endl '\n'
using namespace std;
int n,k,a[1111],sum=-1e10;
void gcd()        //求整个数组的最大子段和
{
    int s=0;
    for(int i=1;i<=n;i++)    //扫描法
    {
        if(s<0)s=a[i];
        else s+=a[i];
        sum=max(sum,s);
    }

    /*
    int s=0,m=0;
    for(int i=1;i<=n;i++)
    {
        s+=a[i]; 
        sum=max(sum,s-m);
        m=min(m,s);
    }    //这是参考某位大佬的代码,暂时没看懂
    */
}
signed main()
{   
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    gcd();
    if(k==1)
    for(int i=1;i

你可能感兴趣的:(算法)