A
# include <bits/stdc++.h>
using namespace std;
#define int long long
int n,a,b;
string s;
void solve()
{
int x=0,y=0;
cin>>n>>a>>b;
cin>>s;
bool st=0;
int l=0;
while(l<=1000)
{
for(int i=0;i<n;i++)
{
if(s[i]=='N')
y++;
else if(s[i]=='E')
x++;
else if(s[i]=='S')y--;
else x--;
if(x==a&&y==b)
st=1;
}
l++;
}
if(st==1)
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
signed main()
{
int T;
cin>>T;
while(T--)
{
solve();
}
}
B 首先b等于特判即可 b大于0我们需要更改b*i+c>=n的数 解不等式向上取整即可
# include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long LL;
int n,b,c;
void solve()
{
cin>>n>>b>>c;
int l=1,r=1e18;
if(b==0)
{
if(c>=n)
{
cout<<n<<endl;
return ;
}
if(n-3>=c)
{
cout<<-1<<endl;
return ;
}
else
{
cout<<n-1<<endl;
return ;
}
}
else cout<<n-max((LL)0,(n-c+b-1)/b)<<endl;
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int T;
cin>>T;
while(T--)
{
solve();
}
}
A
# include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long LL;
int n;
const int N=60;
int a[N];
map<int,int>ma;
void solve()
{
ma.clear();
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
ma[x]++;
}
int mx=0;
for(auto [x,y]:ma)
{
mx=max(mx,y);
}
cout<<n-mx<<endl;
}
signed main()
{
int T;
cin>>T;
while(T--)
{
solve();
}
}
B
只有相邻元素处在相邻的位置才可以即p[i]==i||p[i]==i+1&&p[i+1]==i
# include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long LL;
int n;
const int N=2e5+10;
int a[N];
void solve()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int st=0;
for(int i=1;i<=n;i++)
{
if(a[i]==i)
continue;
if(abs(a[i]-i)>1)
st=1;
}
if(st)
cout<<"NO";
else cout<<"YES";
cout<<endl;
}
signed main()
{
int T;
cin>>T;
while(T--)
{
solve();
}
}
C
当n为偶数的时候,构造方案是显然的。只需选取n/2对正整数,并且让每一对相邻即可,这样每一对的距离都是1,符合平方数的要求。关键是对于奇数情形的构造。这时候必然至少有某一个正整数出现了奇数次,从最小的符合要求的奇数3开始考虑,要使得它们两两之间的距离差均为平方数。
勾股方程的最小一组正整数解是345,也就是下标最大为26,时最小的可构造序列长度为27。27往后即按类偶数构造即可
# include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long LL;
int sub[]={1,2,2,3,3,4,4,5,5,1,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,1,6};
int n;
const int N=2e5+10;
int a[N];
void solve()
{
cin>>n;
if(n%2==0)
{
for(int i=1,j=1;i<=n;i+=2,j++)
cout<<j<<" "<<j<<" ";
}
else
{
if(n<27)
{
cout<<-1<<endl;
return ;
}
for(int i=0;i<=26;i++)
cout<<sub[i]<<" ";
int id=14;
for(int i=28;i<=n;i+=2,id++)
{
cout<<id<<" "<<id<<" ";
}
}
cout<<endl;
}
signed main()
{
int T;
cin>>T;
while(T--)
{
solve();
}
}
D
我们考虑第 n−1个位置。类比最后一个位置,我们发现,这个位置一定能跳到1∼n−1内含有的最大值。此时,1∼n−1内的其他树均没有意义。因为一方面它们不会成为答案,一定不会被跳到,另一方面由于往后跳只能跳到更小的位置,所以若要跳,选取 1∼n−1 内的最大值就够了。如果可以跳到,我们发现可以直接跳到最后一个位置能跳到最大值,可以直接继承。
如果已知 i+1 能跳到最大值,如何求出i能跳到最大值?显然还是一定能跳到1∼i内含有的最大值,且必然还是从最大值往回后跳。考虑往后跳能跳到的最大位置一定是 i+1 能跳到最大值
# include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long LL;
int n;
const int N=5e5+10;
int a[N];
int mx[N],mn[N],f[N];
void solve()
{
cin>>n;
for(int i=1;i<=n+1;i++)
mn[i]=1e18,mx[i]=0;
mx[0]=0,mn[n+1]=1e18;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
mx[i]=max(mx[i-1],a[i]);
}
for(int i=n;i>=1;i--)
{
mn[i]=min(mn[i+1],a[i]);
}
f[n]=mx[n];
for(int i=n-1;i>=1;i--)
{
if(mx[i]>mn[i+1])f[i]=f[i+1];
else f[i]=mx[i];
}
for(int i=1;i<=n;i++)
cout<<f[i]<<" ";
cout<<endl;
}
signed main()
{
int T;
cin>>T;
while(T--)
{
solve();
}
}