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