目录
A. Era
题意:给定一个n,和一个长度为n的数组,问最少添加几个数字使得数组的每一个数字都有
思路:当序列中只有一个不满足条件的元素,那么需要操作次;当有多对元素不满足情况,我们此时应当选取,在最靠近序列起点的不满足条件的元素前面插入元素即可。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[105];
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int ans=0;
for(int i=1;i<=n;i++)
{
//cin>>a[i];
ans=max(ans,a[i]-i);
}
cout<<ans<<endl;
}
}
B. XOR Specia-LIS-t
题意:给定一个数组,问能否将数组分成几段,每一段得到一个最长上升子序列长度,是否可以使序列的异或值等于0。
思路:当n的个数是偶数时,可以分成n段,每段的,1&1==0,两两互相与。
当n的个数是奇数时,找的情况,分成n-1段,和在一段中,此时的,其余的值还是独立一段。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxx=2e5+10;
int a[maxx];
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
//sort(a+1,a+1+n);
if(n%2==0)
cout<<"YES"<<endl;
else
{
//x+x+1+x+2==n
//3x+3==n
//1122345
int f=0;
for(int i=2;i<=n;i++)
{
if(a[i]<=a[i-1])
{
f=1;
}
}
if(f)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
}
C. Di-visible Confusion
题意:给定一个长度为n的数组,每个数的下标为i,如果那么就可以将当前数删去,问能否删去全部的数。
思路:对于第i个数,假如他前面的数能以某种方式被全部删除,如果可以被删除的话,那么我们可以看从2到i+1这些数有没有不能被a[i]整除的。
如果有这样的一个数k,我们在a[i]是第k-1个数的时候删除a[i](因为删除的条件是a[i]不能整除i+1),所以根据数学归纳法前i个数都可以被删除,因此所有的数都要满足这个条件,所以当有一个数不满足这个条件时,即对于2到i+1的数都能整除,那就是NO。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxx=2e5+10;
int a[maxx];
int main()
{
int t,n,x;
cin>>t;
while(t--)
{
cin>>n;
vector<int>v;
v.push_back(0);
for(int i=1; i<=n; i++)
{
cin>>x;
v.push_back(x);
}
//cout<<v.size()<<endl;
bool f;
bool ans=true;
for(int i=1;i<=n;i++)
{
f=false;
for(int j=2;j<=i+1;j++)
{
if(v[i]%j!=0)
{
f=true;
break;
}
}
if(!f)
{
//cout<<i<<endl;
ans=false;
break;
}
}
if(ans)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}//2 3 4
D - Moderate Modular Mode
题意:给定两个数x,y,找到一个n使得
思路:
:使即可。
:, 输出即可。
:(1)假设n < x:那么我们假设n%x = y%n是满足的,那么此时n%x等于n,而y%n此时小于n,矛盾。(2)假设n > y:那么也假设n%x = y%n是满足的,此时n%x小于x,而y%n此时等于y要大于等于x,矛盾(3)因此n在x和y之间。可以通过画图来模拟分析这个过程:设此时在原点,然后每次步长为x向前走,直到不超过y,如下:
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxx=2e5+10;
int a[maxx];
int main()
{
int t,y,x;
cin>>t;
while(t--)
{
cin>>x>>y;
if(x==y)
cout<<x<<endl;
else if(x>y)
{
cout<<x+y<<endl;
}
else
{
//4 6
//4 8
// a%4 (y-a)+x==
// 8%a y-a
cout<<y-(y%x)/2<<endl;
}
}
}//2 3 4