8 条题解

  • 1
    @ 2021-05-28 16:32:53

    主要需要考虑左侧最大值和右侧最大值的位置,左侧最大值和右侧最大值中间的数可可以略去不看,因此考虑“实际的数组长度”,另外,再考虑最大值在边缘的情况即可.

    #include <stdio.h>
    #include <iostream>
    using namespace std;
    #define len(arr) (sizeof(arr) / sizeof(arr[0]))
    void findMaxPosi(int *, int, int &, int &);
    int main(int argc, char const *argv[])
    {
        int length;
        cin >> length;
        int *arr = new int[length];
        for (size_t i = 0; i < length; i++)
        {
            cin >> arr[i];
        }
        int left = 0;
        int right = 0;
        findMaxPosi(arr, length, left, right);
        if (left == 0 || right == length - 1)
        {
            cout << "Win" << endl;
            return 0;
        }
        int real_length = length - (right - left);
        if (real_length % 2 == 1)
        {
            cout << "Lost" << endl;
            
        }
        else
        {
            cout << "Win" << endl;
        }
    
        delete[] arr;
        return 0;
    }
    void findMaxPosi(int *array, int length, int &left, int &right)
    {
        int max = array[0];
    
        for (int i = 1; i < length; i++)
        {
            if (array[i] > max)
            {
                left = i;
                right = i;
                max = array[i];
            }
            else if (array[i] == max)
            {
                right = i;
            }
        }
    }
    
    
  • 1
    @ 2018-12-02 23:30:16

    从一串数中取最大数,首先确定可能被取到的最大数(第一个或者最后一个)
    //该部分代码

    for(i=0;i<n;i++)
        {
            cin>>a[i];
            if(max<a[i])
                max=a[i];
        }
        for(i=0;a[i]!=max;i++)
            left++;//第一个数的位置(左侧有多少数)
        for(i=n-1;a[i]!=max;i--)
            right++;//最后一个数的位置(右侧有多少数)
    

    左右两侧的数都可以成对移去,即最终剩下(1,1)(1,2)(2,1)或(2,2)个数
    逐个分析,可以发现,左右两侧数量之和为奇数时,小明获胜;反之,小璐获胜。
    //整体代码如下

    #include<iostream>
    using namespace std;
    int main()
    {
        int left=0,right=0,max=-2147483648,n,i,*a;
        cin>>n;
        a=new int[n];
        for(i=0;i<n;i++)
        {
            cin>>a[i];
            if(max<a[i])
                max=a[i];
        }
        for(i=0;a[i]!=max;i++)
            left++;
        for(i=n-1;a[i]!=max;i--)
            right++;
        if((left+right)%2)
            cout<<"Win";
        else
            cout<<"Lost";
        delete[] a;
        return 0;
    }
    
  • 0
    @ 2019-10-05 00:31:23
    #include <iostream>
    using namespace std;
    int a[100010];  //存储数据
    int FindMaxLR(int n,int a[]);
    int FindMaxLR(int n,int a[])
    {
        int max=a[0],k1=0,k2=n-1,i;
        for(i=1;i<n;i++)  //寻找正序中第一个最大值的下标
        {
            if(a[i]>max)
            {
                max=a[i];
                k1=i;
            }
        }
        max=a[n-1];
        for(i=n-1;i>=0;i--)  //寻找逆序中第一个最大值的下标
        {
            if(a[i]>max)
            {
                max=a[i];
                k2=i;
            }
        }
        if(k1==0 || k2==n-1)
            return 1;      //如果最大值在边界点上,则赢。
        return k1+n-1-k2;  //否则返回距离边界最近的最大值分别在左右的数字个数
    }
    int main()
    {
        //freopen("tset.txt","r",stdin);
        //freopen("result.txt","w",stdout);
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>a[i];
        if(FindMaxLR(n,a)%2!=0)
        //如果最大值在边界点上,则赢。
        //如果不在,若左边的最大值左边的数
        //和右边的最大值右边的数加起来为奇数,
        //则可以取较多数的那一边使得最后对方取数时
        //最大数的左右各剩一个数,赢。
        //反之,则输。
            cout<<"Win";
        else
            cout<<"Lost";
        return 0;
    }
    
  • 0
    @ 2018-12-07 16:30:01
    #include <iostream>
    #include <cstdio>
    using namespace std;
    
    int FindiMax(int a[],int n) {
        int imax=0;
        for(int i=1; i<n; i++)
            if(a[i]>a[imax])  imax=i;
        return imax;
    }
    int Findi(int a[],int n,int x) {
        for(int i=n-1; i>=0; i--)
            if(a[i]==x)
                return i;
    }
    
    
    int main() {
    //  freopen(  "H:\\命题\\0 网站\\2\\Test\\Input\\input0.txt","r",stdin);
    //  freopen("H:\\命题\\0 网站\\2\\Test\\Output\\output0.txt","w",stdout);
        int n;
        cin>>n;
        int a[n];
        for(int i=0; i<n; i++) cin>>a[i];
        int left = FindiMax(a, n);
        int right= Findi(a,n, a[left]);
        int m=left + n-right-1;
        if(m%2==1)
            cout<<"Win"<<endl;
        else
            cout<<"Lost"<<endl;
        return 0;
    }
    
  • 0
    @ 2018-12-03 11:12:37

    这个题解肯定是有问题的,虽然跑的通
    输入两行,第一行是一个正整数n(n<100000),第二行是n个用空格分开的整数(保证不超过整数的范围)。
    既然是整数,那么就不一定是正整数,那么直接把max赋值为0就是有问题的,如果全部都是负数,那么寻找max的实现代码就是错的,但显然设计测试数据时候没考虑到这点,跑通了,不过思想是这个

    • @ 2018-12-03 11:56:50

      意思是将他的max的初始值赋为-2147483648吗

    • @ 2018-12-03 12:15:21

      感谢提醒

    • @ 2018-12-03 18:37:56

      @njnu09170424: 赋成最小值是肯定没问题的,不过我是先读取第一个数,然后将最小值赋成它。

    • @ 2018-12-03 18:38:12

      @ZhouT.x.: 没事,打那么多字辛苦了

  • -1

    #include<iostream>
    using namespace std;
    int main()
    {
    int left=0,right=0,max=-2147483648,n,i,*a;
    cin>>n;
    a=new int[n];
    for(i=0;i<n;i++)
    {
    cin>>a[i];
    if(max<a[i])
    max=a[i];
    }
    for(i=0;a[i]!=max;i++)
    left++;
    for(i=n-1;a[i]!=max;i--)
    right++;
    if((left+right)%2)
    cout<<"Win";
    else
    cout<<"Lost";
    delete[] a;
    return 0;
    }

  • -2

    aaa

  • -2

    #include<iostream>
    using namespace std;
    int main()
    {
    int left=0,right=0,max=-2147483648,n,i,*a;
    cin>>n;
    a=new int[n];
    for(i=0;i<n;i++)
    {
    cin>>a[i];
    if(max<a[i])
    max=a[i];
    }
    for(i=0;a[i]!=max;i++)
    left++;
    for(i=n-1;a[i]!=max;i--)
    right++;
    if((left+right)%2)
    cout<<"Win";
    else
    cout<<"Lost";
    delete[] a;
    return 0;
    }

  • 1

信息

难度
8
分类
(无)
标签
递交数
693
已通过
105
通过率
15%
被复制
8
上传者