I.Fibonacci in the Pocket
打表+大数取余,左a上b
1 | 2 | 0 | |
1 | odd | even | even |
2 | even | odd | odd |
0 | odd | even | even |
#include <bits/stdc++.h>
using namespace std;
char a[1000005];
char b[1000005];
int yu(char num[1000005]){//大数取余
int len = strlen(num);
int ans = 0;
for(int i = 0; i < len; ++i)
{
ans = ans*10 + (num[i]-'0');
ans %= 3;
}
return ans;
}
int main()
{
int T,n;
cin>>T;
while(T--){
cin>>a>>b;
if((yu(b)==1&&yu(a)!=2)||(yu(a)==2&&yu(b)!=1)){
cout<<1<<endl;
}
else cout<<0<<endl;
}
}
H.Singing Everywhere
最多只能减少2个,因此分类讨论+模拟
#include <bits/stdc++.h>
using namespace std;
int a[1000005],b[1000005],vis[1000005];
int main()
{
int T;
cin>>T;
int n;
while(T--){
cin>>n;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)scanf("%d",&a[i]);
int flag=0;
int tmp;
int cnt=0;
for(int i=1;i<n-1;i++){
if(a[i]>a[i-1]&&a[i]>a[i+1]){
cnt++;
vis[i]=1;
if(tmp!=a[i])tmp=a[i];
else flag=1;//隔壁两个极值相同,则删去他们中间那个数,如19191删去中间的1
}
}
//cout<<cnt<<endl;
if(flag==1)cout<<cnt-2<<endl;
else{
int ok=0;
for(int i=1;i<n-1;i++){
if(vis[i])continue;//假设删除这个极值
int l=1;
int r=1;
while(vis[i-l]&&i-l>=0)l--;
while(vis[i+r]&&r+i<n)r++;
if(a[i]>a[i-l]&&a[i]>a[i+r])ok++;//产生新的极值
}
cout<<max(ok,cnt-1)<<endl;//如果删去某个极值没影响结果,ok会和cnt一样
}
}
}
E.Sequence in the Pocket
从后往前扫,从最大开始找
因为①最大的数不可能提前,后移次数确定
②最多移n-1次,一个元素相邻位置确定需要移动次数减一
#include <bits/stdc++.h>
using namespace std;
int a[100005],b[100005];
int main()
{
int t,n;
cin>>t;
while(t--){
int cnt=0;
scanf("%d",&n);
int r=n-1;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b,b+n);//排序
for(int i=n-1;i>=0;i--){
if(a[i]==b[r]){//从最大值开始找,找到就往前
r--;
}
else{
cnt++;
}
}
cout<<cnt<<endl;
}
}