思维场,没啥好说的……
A题解:
找最大值最小值下标,但我一开始交了一发,思路是对的,和官方题解几乎一样(变量名都一样hh),但是就是报错了,无奈之下就加了几个特判,莫名其妙过了……
AC代码:代码很乱,凑活着看……
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define N 300010
#define MOD 1000000007
using namespace std;
int t,n,m;
int a[N];
int main()
{
cin>>t;
while(t--)
{
int maxx=-1e9,minn=1e9;
int maxi=0,mini=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
if(n==1)
cout<<"1 1"<<endl;
else if(n==2)
cout<<"1 2"<<endl;
else if(n>=3)
{
int flag=0;
int ans=a[1];
for(int i=2;i<=n;i++)
{
if(a[i]!=ans)
{
flag=1;
break;
}
}
if(flag==0)
{
cout<<"1 2"<<endl;
}
else
{
for(int i=1;i<=n;i++)
{
if(a[i]>=maxx)
{
maxx=a[i];
maxi=i;
}
}
for(int i=1;i<=n;i++)
{
if(a[i]<=minn)
{
minn=a[i];
mini=i;
}
}
cout<<mini<<" "<<maxi<<endl;
}
}
}
return 0;
}
题解B:
思路是找到一对数的差为k,|ai−ak|+|ak−aj|=ai−ak+ak−aj=ai−aj=|ai−aj|,然而第一发我就是直接暴力枚举,但这是O(n2)肯定是不行的。
AC代码:(set做法):看某位dalao的代码有点启发
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<set>
using namespace std;
void solve()
{
int n,k,e;
set<int> S;
set<int>::iterator it;
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>e;
S.insert(e);
}
for(it=S.begin();it!=S.end();++it)
{
if(S.count(*it+k))
{
cout<<"YES"<<endl;
return;
}
}
cout<<"NO"<<endl;
}
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}
题解C:
只要同时存在0,1则不合法
没有1,就可以都%为0,方法:每次%上他自身
讨论变为1的情况:又连续两个数无论如何都会存在1
AC代码:(set写法)
#include<stdio.h>
#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
void solve()
{
int n,x;
cin>>n;
set<int> S;
set<int>::iterator it;
int c0=0,c1=0;
for(int i=0;i<n;i++)
{
cin>>x;
S.insert(x);
if(x==0)
c0++;
if(x==1)
c1++;
}
if(c1==0)
cout<<"YES"<<endl;//每次%他自身就可以实现全置0
else if(c1!=0&&c0!=0)
cout<<"NO"<<endl;
else
{
for(it=S.begin();it!=S.end();++it)
{
if(S.count(*it+1))//全局检查有无连续
{
cout<<"NO"<<endl;
return;
}
}
cout<<"YES"<<endl;
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}
题解D: