题目大意:整数序列a1,a2,…an。可以执行以下操作任意次(可能是零次):
选择任意正整数k(在不同的操作中可以不同)。
选择序列中的任何位置(可能是序列的开头或结尾,或者在任意两个元素之间),并在该位置将k插入序列。
这样,序列a改变,并且对该改变的序列执行下一操作。
例如,如果a=[3,3,4]并且他选择k=2,则在运算之后,他可以获得序列[2-,3,3,4]、[3,2-,3,4]、[3,3,2-,4]或[3,3,4,2-]中的一个。
要求这个序列满足:对于每个1≤i≤|a|,ai≤i,这里,|a|表示a的大小。
帮助找到实现这一目标所需执行的最少操作次数。
input
4 3 1 3 4 5 1 2 5 7 4 1 1 3 69 6969 696969output
1 3 0 696966
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string>
#include<map>
#include<vector>
using namespace std;
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int a[200200];
int flag=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]>i+flag) flag+=a[i]-(i+flag);
}
cout<<flag<<endl;
}
return 0;
}
一直读不懂题,我人麻了,请教苏佬才懂。QAQ
题目大意:给定一个序列a,你可以把它分成若干份,对于每一份,定义h k为该序列的最长上升子序列,问是否存在划分方法使得h1,h2,h3......h k异或为0?
异或:相同为0,不同为1
0^0=0 0^1=1 1^0=1 1^1=0
思路:当n为偶数个的时候一个一个划分直接异或为0;
当n为奇数个的时候,如果能够消掉一个数(a[i-1]>=a[i],这两为一组,那么它的最长上升子序列被判为1个),这样就变成了偶数个。
input
4 7 1 3 4 2 2 1 5 3 1 3 4 5 1 3 2 4 2 4 4 3 2 1output
YES NO YES YES
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<map>
using namespace std;
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int a[200200];
for(int i=1;i<=n;i++)
cin>>a[i];
if(n%2==0) cout<<"YES"<<endl;
else
{
bool flag=false;
for(int i=1;i<=n;i++)
if(a[i-1]>=a[i]) { flag=true; break; }
if(flag==true) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
return 0;
}
a不能被b整除的意思是b%a!=0
题目大意:有整数序列a1,a2……An. 将执行以下操作,直到序列变为空:选择索引i,使得1≤i≤|a|和ai不能被(i+1)整除,并从序列中删除该元素。注意,序列A改变,并且对该改变的序列执行下一操作。
例如,如果a=[3,5,4,5],则他可以选择i=2,因为a2=5不能被i+1=3整除。在此操作之后,序列是[3,4,5]。
帮助确定是否可以使用上述操作擦除整个序列。
input
5 3 1 2 3 1 2 2 7 7 10 384836991 191890310 576823355 782177068 404011431 818008580 954291757 160449218 155374934 840594328 8 6 69 696 69696 696969 6969696 69696969 696969696output
YES NO YES YES NO
c比b好写多了,题意容易读懂。
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<string>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int a[200200],b[200200]={0};
for(int i=1;i<=n;i++)
cin>>a[i];
int sum=0;
for(int i=1;i<=n;i++)
{
if(a[i]%(i+1)!=0) sum++;
else
{
bool flag=false;
for(int j=i;j>=(i+1-sum);j--)
if(a[i]%j!=0) { flag=true; sum++; break; }
if(flag==false) break;
}
}
if(sum==n) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
题目大意:两个偶数x和y,找出一个正整数n,1 ≤ n ≤ 2*10的18次方,需要满足n%x=y%n
如果有多个这样的整数,则输出any。
input
4 4 8 4 2 420 420 69420 42068output
4 10 420 9969128
可明显发现,等式两边的余数就是y mod x
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
long long int x,y;
scanf("%lld %lld",&x,&y);
if(x>y) printf("%lld\n",x+y);
else if(x==y) printf("%lld\n",x);
else if(x<y) printf("%lld\n",y-(y%x)/2);
}
return 0;
}
一开始wa在x<y时,我直接输出了(x+y)/ 2 。
它说我没有给出最优答案,我寻思着这题难道不是随便输出合法的就行了嘛???(· ·)