8 条题解
-
1njnu26190415 LV 7 @ 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; } } }
-
12018-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; }
-
02019-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; }
-
02018-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; }
-
02018-12-03 11:12:37@
这个题解肯定是有问题的,虽然跑的通
输入两行,第一行是一个正整数n(n<100000),第二行是n个用空格分开的整数(保证不超过整数的范围)。
既然是整数,那么就不一定是正整数,那么直接把max赋值为0就是有问题的,如果全部都是负数,那么寻找max的实现代码就是错的,但显然设计测试数据时候没考虑到这点,跑通了,不过思想是这个 -
-12021-03-13 13:53:44@
#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;
} -
-22021-03-24 17:02:42@
aaa
-
-22021-03-13 13:53:51@
#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
信息
- 难度
- 7
- 分类
- (无)
- 标签
- 递交数
- 588
- 已通过
- 97
- 通过率
- 16%
- 被复制
- 8
- 上传者