19浙江省赛部分题

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;
	  
	  
  }
}

猜你喜欢

转载自blog.csdn.net/zjyang12345/article/details/89602477