数组输入与小米oj的一道题的疑问

事情呢是这样的,在小米oj上做了个比赛,题目要求输入一个数组,但是数组个数未知
链接:https://code.mi.com/problem/list/view?id=119

挂个图:

然后呢 ,这个题我确实做出了,但是我的输入方法很狗,因为我看到输入的数组都是10以下的,所以我就…(部分代码)

用字符来变–>
code大概就是这个样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/*输入样例
2 0 1 0 0 3 4
复制样例
输出样例
false*/
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
int a[11];
char c[200];
int ans=0;
cin.getline(c,200);
for(int i=0;i<strlen(c);i++){
if(c[i]>='0'&&c[i]<='9'){
a[ans++]=c[i]-'0';
}
}
//cout<<ans<<endl;
if(ans==1){
cout<<"true"<<endl;
return 0;
}
if(a[0]==0){
cout<<"false"<<endl;
return 0;
}
for(int i=0+a[0];i<ans;){
if(a[i]!=0){
if(i==ans-1){
cout<<"true"<<endl;
return 0;
}
else
i+=a[i];
}
if(a[i]==0){
if(i==ans-1){
cout<<"true"<<endl;
return 0;
}
else {
cout<<"false"<<endl;
return 0;
}
}

}
cout<<"false"<<endl;
return 0;

}

然后AC了就没想多了,就去做下一题了,不得不提,久了不做题真的菜狗,第二题就是个博弈,然后之前学SG的时候觉得很难就回避了,然后那个题呢我感觉吧是斐波拉契博弈,想死不AC,然后结局嘛就是一题签到了呗
有兴趣的可以看看这个比赛的题:(就是小米oj12月月赛)https://code.mi.com/contest/list/view?id=4
考完毛概好好学习SG函数和PY,最近又开始了PY大法之路,自我勉励下!!!

言归正传,然后我去mioj继续做题,结果碰上了这个:

这个题目啊还是未知数组个数就输入数组,但是这里数据并不是小于10了,所以之前那种偷懒的方法啊不管用,于是我去博客学习了一下这种方法没用vector存:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <bits/stdc++.h>
using namespace std;
int cat[257];
int main()
{
vector<int> a;
int ans=0;
int wyh=0;
do{
cin>>wyh;
a.push_back(wyh);
ans++;
}
while(getchar()!='\n');
for(int i=0;i<=256;i++)cat[i]=0;
for(int i=0;i<ans;i++){
int x=a[i];
cat[x]++;
}
for(int i=0;i<=257;i++){
if(cat[i]==1){
cout<<i<<endl;
return 0;
}
}
return 0;
}

重点就是这一部分的代码::


1
2
3
4
5
6
7
8
9
    vector<int> a;
int ans=0;
int wyh=0;
do{
cin>>wyh;
a.push_back(wyh);
ans++;
}
while(getchar()!='\n');

OK,这样写好之后提交然后MLE,苦思冥想不懂其原因,于是上网查了查,看有人用位运算写,于是也写了一发位运算::

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int temp;
int result = 0;
do
{
cin>>temp;
result^=temp;
}
while(getchar()!='\n');
cout<<result<<endl;
return 0;
}

我觉得这个位运算的思路很牛逼啊,结果提交之后TLE???
我就懵逼了…
对了,附上题目链接:https://code.mi.com/problem/list/view?id=2,如果有大佬看到这条博客并且有兴趣指导下小弟,受教!

更新,写完博客后又去想这个问题,我真的想说一句:傻逼题!!!
我AC了,并且两种方法都AC了,所有的问题出在我想多了,这个题根本不用…考虑在未知数组大小的情况下输入数组内容,我真想一巴掌扇死出题人,这么出题目,我TM样例的输出都出不来,他妈的这样的code去AC????
好了,B话不多说
CODE1:
//孬比方法:(初代)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <bits/stdc++.h>
using namespace std;
int cat[257];
int main()
{
int a[21];
int ans=0;
int wyh=0;
int m;
while(cin>>m){
a[ans]=m;
ans++;
}
for(int i=0;i<=256;i++)cat[i]=0;
for(int i=0;i<ans;i++){
int x=a[i];
cat[x]++;
}
for(int i=0;i<=257;i++){
if(cat[i]==1){
cout<<i<<endl;
return 0;
}
}
return 0;
}

CODE2:
//位运算:(改版)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int a[21];
int ans=0;
int m;
/*do{
scanf("%d",&a[ans]);
ans++;
}
while(getchar()!='\n');*/
//for(int i=0;i<ans;i++)cout<<a[i]<<endl;
while(cin>>m){
a[ans]=m;
ans++;
}
int cnt=0;
for(int i=0;i<ans;i++){
cnt^=a[i];
}
printf("%d",cnt);
return 0;
}

直接while(cin>>m)竟然就AC了…
coswindy

-------------本文结束感谢您的阅读-------------