2019年浙江省省赛

 


前言

2019年浙江省省赛

 

一、E - Sequence in the Pocket

题意:T组数据,每组n个数字,你可以每次选一个数字放到最前面,问最少几次能使序列是升序排列。

思路:建一个备份数组复制并排序,然后与原数组从后往前比较,没找到一个相同的说明不需要移动,最后输出最小的移动即可。

#include <iostream>
#include <stdio.h>
#include <algorithm>

using namespace std;

int main(int argc, char *argv[])
{
	int t;
	cin>>t;
	int a[100005];
	int b[100005];
	while(t--){
		int n;
		cin>>n;
		for (int i = 1;i <= n;i++){
			scanf("%d",&a[i]);
			b[i] = a[i];
		}
		sort(b+1,b+n+1);
		int res = 0,p = n;
		for(int i = n;i >= 1;i--){
			while(p > 0){
				if (b[i] != a[p]){
					p--;
					res++;
				}
				else{
					p--;
					break;
				}
			}
		}
		cout<<res<<endl;
	}
	return 0;
}

二、F - Abbreviation

 

题意:T组数据,每组一个字符串,除第一个字符外删除其中的aeiyou。

思路:循环判断。

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
	int t;
	cin>>t;
	string s,p = "aeiyou";
	while(t--){
		cin>>s;
		string res;
		res += s[0];
		for (int i = 1;i < s.size();i++){
			int flag = 1;
			for(int j = 0;j < 6;j++){
				if (s[i] == p[j]) flag = 0;
			}
			if (flag) res += s[i];
		} 
		cout<<res<<endl;
	}
	return 0;
}

三、G - Lucky 7 in the Pocket

 

题意:T组数据,每组一个正整数n,输出一个数字m要求m最小且大于等于n且m能被7整除不能被4整除。

思路:从n开始一个一个往上加,逐个判断,符合就输出并break。

#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
	int t,n;
	cin>>t;
	while(t--){
		cin>>n;
		for(int i = n;i<= 200;i++){
			if (i % 7 == 0 && i % 4 != 0) {
				cout<<i<<endl;
				break;
			}
		}
	}
	return 0;
}

四、H - Singing Everywhere

 

题意:T组数据,每组两行,第一行一个数字n代表歌的长度,第二行长度为n的序列,代表歌的每一个音符。这首歌的噪音越少分数越高(噪音就是这个序列里面一个数都大于两边的数字例如:1 2 3 2 4,3就是噪音)。你现在可以删除一个字符,使这首歌最少有几个噪音。

思路:因为只能删除一个字符,所以只会有三种情况:删除0、1、2个。先统计一首歌的噪音的个数(sum)和位置(存放在数组a中),然后判断有没有双峰,有双峰就sun-2输出,没有就输出sum-1,特判一下sum等于0和1的情况。

双峰:就是两个噪音是连续的且相等的

7

1 9 1 9 8 1 0

两个9就是双峰,只要去掉中间的1就能删去两个噪音。

#include <iostream>
#include <stdio.h>

using namespace std;

int main(int argc, char *argv[])
{
	int t,n;
	cin>>t;
	int a[100005];
	int b[100005];
	while(t--){
		cin>>n;
		int sum = 0,p=0;
		for(int i = 1;i <= n;i++){
			scanf("%d",&a[i]);
		}
		for(int i = 2;i < n;i++){
			if(a[i] > a[i-1] && a[i] > a[i+1]){
				sum++;
				b[p++] = i;
			}
		}
		int flag = 1;
		for(int i = 0;i < p-1;i++){
			if(a[b[i]] == a[b[i+1]]) {
				sum -= 2;
				flag = 0;
				break;
			}
		}
		if (p == 0) cout<<0<<endl;
		else if (p == 1){
			if (a[b[0]-1] > a[b[0]-2] && a[b[0]-1] > a[b[0]+1]) cout<<1<<endl;
			else if (a[b[0]+1] > a[b[0]-1] && a[b[0]+1] > a[b[0]+2])cout<<1<<endl;
			else cout<<0<<endl;
		}
		else if (flag) cout<<sum-1<<endl;
		else cout<<sum<<endl;
	}
	return 0;
}

五、I - Fibonacci in the Pocket

 

题意:T组数据,每组两个正整数a,b且a<=b,代表裴波纳契数列fa,fb,求fa到fb的和是奇数还是偶数

裴波纳契数列:fa = f(a-1) + f(a-2) a>=3    f = 1 1 2 3 5 8 13 21 34

思路:找规律

     a%3 == 0                   a%3==2                      a%3==1

裴波纳契数列奇偶周期为3个一循环。

可以发现当a%3的结果为0,1的时候规律是一样的(偶偶奇),然后发现b%3==1时结果为奇数,其他为偶数

当a%3==2时候发现b%3==1的时候结果为偶数其他为奇数。

3有一个数学规律,就是数字%3的结果等于该数字各位数之和%3

#include <iostream>
#include <algorithm>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
	int t;
	cin>>t;
	string a,b;
	while(t--){
		cin>>a>>b;
		int ia=0,ib=0;
		for(int i = 0;i < a.size();i++) ia += a[i]-'0';
		for(int i = 0;i < b.size();i++) ib += b[i]-'0';
		//cout<<"a="<<ia<<" b="<<ib<<endl;
		if(ia%3 == 1 || ia % 3 == 0){
			if (ib % 3 == 1) cout<<1<<endl;
			else cout<<0<<endl;
		}else{
			if (ib % 3 == 1) cout<<0<<endl;
			else cout<<1<<endl;
		}
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值