1,A. Era-Codeforces Round #752 (Div. 2)
题意:数组中有n个数。可以在任何一个位置添加任何一个数,要求使得数组中任何一个元素的位置要大于该元素的值。
题解:将每个元素的值减去所在位置,求最大值并输出。
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
int i1,i2,i4;
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> n;
int max1=0;
for(i1=1;i1<=n;i1++)
{
cin >> i2;
max1=max(max1,i2-i1);
}
cout <<max1<< endl;
}
return 0;
}
解释:要求元素值小于该位置,只需要在该元素之前添加缺少的1即可。在第一个元素之前添加1来满足最大条件也就是满足了所有条件了。
2,B. XOR Specia-LIS-t-Codeforces Round #752 (Div. 2)
题意,n个元素的数组。把数组任意地分为k份。每份的最大严格上升子序列值为pi。问能否将这pi按位异或所得值为零。
题解:判断元素个数是否为偶数,若果是,输出yes。如果数组中有a[i]>=a[i+1],输出yes,否则输出no。
#include<iostream>
using namespace std;
int n,m;
int i1,i2,i3,i4,i5;
int a[100010];
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> n;
int flag=0;
for(i1=1;i1<=n;i1++)
if(i1==1) cin>>a[i1];
else {
cin >> a[i1];
if(a[i1]<=a[i1-1]) flag=1;
}
if(n%2==0) cout << "YES" << endl;
else if(flag==1) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
解释:如果是偶数,那所有元素都分成一份,按位异或后为零。把pi转换为二进制,要想按位异或后等于零,说明异或时,该位的一需要出现偶数次。如果是n是奇数,并且所有都是递增,说明无论怎么分,永远都无法使pi最后一位有偶数次1,但是如果有一个不增加就可以在这个位置断一下,分为三段,之后就可以有偶数次一了。有同学会问,那有很多次不增加怎么办,那就只找出一个不增加,然后把其余的不想增加合并到另外两个数组中即可。
总结:这题没想出来看的题解,按位运算确实太灵活了,技巧性太强,有很多性质需要背过。
3,C. Di-visible Confusion-Codeforces Round #752 (Div. 2)
题意:n个元素的整数数组,要求如果ai%i!=0,便可以消掉。可以任意选择位置消除,问该数组是否可以全部消除。
题解:设变量k,从第一个元素开始j=i+1,如果ai%j= =0,则j–,j一共可以减少k次,如果k次后还是取余为零,这输出NO。如果j减小过程中满足条件,则k++,i++,最后一个元素时输出YeS。
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int n,m,k;
int i1,i2,i3,i4;
int a[100010];
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> n;k=0;
for(i1=1;i1<=n;i1++)
scanf("%d",&a[i1]);
i1=1;
while(i1<=n)
{
i2=i1+1;i3=k;
while(a[i1]%i2==0) {i2--;i3--;if(i3==-1) break;}
if(i3==-1) {cout<<"NO"<<endl;break;}
else {k++;if(i1==n) {cout<<"YES"<<endl;break;}}
i1++;
}
}
return 0;
}
解释:前面的数如果可以消去k++,k代表了弹性空间。因为前面的数可以消去,也可以不消去,前i个数消去的顺序不会影响到k的值。
4,D. Moderate Modular Mode-Codeforces Round #752 (Div. 2)
题意:x,y总存在n使得n%x=y%n,输出n。
题解:如果x==y,输出x。如果x<y,输出x+y。如果x>y,输出y-y%x/2.
#include<iostream>
using namespace std;
#define ll long long
ll x,y,temp;
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> x>>y;
if(x==y) cout <<x << endl;
else if(x>y) cout <<x+y<< endl;
else {
temp=y%x;
temp=temp/2;
cout<<y-temp<<endl;
}
}
return 0;
}
解释:相等不解释。小于时,发现y可以是n%x的余数,y只要取余一个比自己大的就可以了。大于时,n%x不能使y了吧。两种方法,(1)设z为一个很小的值,y%(y-z)=z,(y-z)%x=y%x-z,那z=y%x-z,2*z=y%x。
(2)如果在数轴上,那y一定在x的右边,设n为x的倍数,那当n在x,y之间时,会发现y%n结果是n,而n%x=0,那假设p=n+z,而且p>x,p<y。说明y%
总结:现在做题越来越没有信心了,也不敢尝试了,觉得尝试了也会是错的。(︶︿︶)=凸