The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple (Mirror)

G Lucky 7 in the Pocket

签到题,然而因为刚睡醒打错一个字母WA了三次,还活生生改不出来,重构才过,?,队友们,我对不起你们。。。

# include <bits/stdc++.h>
using namespace std;

int main()
{
	int t;
	
	scanf("%d",&t);
	for(int j=0;j<t;j++){
		if(j!=0) printf("\n");
		int a;
		scanf("%d",&a);
		if(a%7==0&&a%4!=0){
			printf("%d",a);
			continue;
		}
		int d=(a/7+1)*7;
		for(int i=d;;i++){
			if(i%7==0&&i%4!=0){
				printf("%d",i);
				break;
			}else{
				continue;
			}
		}
		
	}
	
	return 0;
}

F Abbreviation

另一个签到题,除了首字母位置上的,其他位置上的元音字母不输出就行

# include <bits/stdc++.h>
using namespace std;

int main()
{
	int t;
	
	scanf("%d",&t);
	while(t--){
		string s;
		cin>>s;
		for(int i=0;i<s.length();i++){
			if(i==0){
				printf("%c",s[i]);
			}else{
				if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='y'||s[i]=='o'||s[i]=='u'){
					continue;
				}else{
					printf("%c",s[i]);
				}
			}
		}
		printf("\n");
	}
	
	return 0;
}

I Fibonacci in the Pocket

可以打表得到斐波那契函数的奇偶情况,(奇数输出1,偶数输出0),发现是以三个一循环的
在这里插入图片描述在发现这个规律后,再来考虑这个问题。每三个一循环,那么数就变成了偶数,0是偶数,可以用0来代替其他偶数,1是奇数,可以代替其他奇数,那么只要算除了完整循环之外的就行(感觉没有说清楚,看代码吧QAQ),有一个坑点就是要注意是否在区间里面有完整的循环,这一点很重要,不是完整循环的单独出来考虑

# include <bits/stdc++.h>
using namespace std;

typedef long long LL;
int main()
{
	int t;
	
	scanf("%d",&t);
	while(t--){
		string a,b;
		LL as=0,bs=0;
		LL sum=0;
		cin>>a;
		cin>>b;
		int lena=a.length();
		int lenb=b.length();
		int l=lena-1;
		int flag1=0;
		int aa=a[l]-'0';
		int bb=b[l]-'0';
		if(lenb==lena){
			for(int i=0;i<lena;i++){
				if(a[i]==b[i]) continue;
				else{
					l=i;
				}
			}
			if(l!=(lena-1)) flag1=1;
			else{
				if((bb-aa)>=3) flag1=1;
			}
		}
		//cout<<"@"<<flag1<<endl;
		if((lena!=lenb)||flag1){
			for(int i=0;i<a.length();i++){
				int d=a[i]-'0';
				as=((as%3)+(d%3))%3;
			}
			as=as%3;
			//cout<<"a"<<" "<<as<<endl;
			if(as==0){
				sum+=0;
			}else if(as==1){
				sum+=2;
			}else if(as==2){
				sum+=1;
			}
			for(int i=0;i<b.length();i++){
				int d=b[i]-'0';
				bs=((bs%3)+(d%3))%3;
			}
			bs=bs%3;
			//cout<<"b"<<" "<<bs<<endl;
			if(bs==0){
				sum+=2;
			}else if(bs==1){
				sum+=1;
			}else if(bs==2){
				sum+=2;
			}
			//cout<<"@"<<sum<<endl;
			if(sum%2==0){
				printf("0\n");
			}else{
				printf("1\n");
			}
		}else{
			for(int i=0;i<a.length();i++){
				int d=a[i]-'0';
				as=((as%3)+(d%3))%3;
			}
			as=as%3;
			for(int i=0;i<b.length();i++){
				int d=b[i]-'0';
				bs=((bs%3)+(d%3))%3;
			}
			bs=bs%3;
			for(int i=as;i<=bs;i++){
				if(i==1){
					sum+=1;
				}else if(i==2){
					sum+=1;
				}else if(i==0){
					sum==0;
				}
			}
			//cout<<"@"<<sum<<endl;
			if(sum%2==0){
				printf("0\n");
			}else{
				printf("1\n");
			}
		}
		
	}
	
	
	return 0;
}

H Singing Everywhere

就是先遍历一遍,看看有多少的破音点,然后遍历每一个低谷点,考虑把低谷点删除,看看对现在的破音点有什么影响。影响的话要分情况讨论,首先左右两个是不是都是峰点,然后低谷点删除了之后对左右两个峰点有什么影响,破音点是减少一个还是减少两个,还是不减少

# include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const LL MAXN=1e5+10;
LL a[MAXN];
int main()
{
	int t;
	
	scanf("%d",&t);
	while(t--){
		LL n;
		int flag1=0,flag2=0;
		LL ans=0;
		
		scanf("%lld",&n);
		for(LL i=0;i<n;i++){
			scanf("%lld",&a[i]);
		}
		
		for(LL i=1;i<(n-1);i++){
			if(a[i]>a[i+1]&&a[i]>a[i-1]) ans++;
		}
		for(LL i=1;i<(n-1);i++){
			int fe=0,fb=0;
			if(a[i]<a[i+1]&&a[i]<a[i-1]){
				if((i+2)<n){
					if(a[i+1]>a[i]&&a[i+1]>a[i+2]){
						if(a[i-1]<a[i+1]){
						}else{
							fe=1;
						}
					}
				}
				if((i-2)>=0){
					if(a[i-1]>a[i-2]&&a[i-1]>a[i]){
						if(a[i-1]>a[i+1]){
						}else{
							fb=1;
						}
					}
				}
				//cout<<fb<<" "<<fe<<endl;
				if(fe||fb){
					flag1=1;
				}
				if(fe&&fb){
					flag2=1;
				}
			}
		}
	//	cout<<"@"<<flag1<<" "<<flag2<<" "<<ans<<endl;
		if(flag2){
			ans-=2;
		}else{
			if(flag1){
				ans-=1;
			}
		}
		printf("%lld\n",ans);
	}
	
	return 0;
}

H Sequence in the Pocket

算是一个比较重视思路的题目吧,就是先考虑当前的有多少个已经排好序了,然后总个数减去已经排好序的个数,就是最小的移动次数(对于每一个未排好序的数,最少只要移动一次就行。就是在未排好序的所有数中先移动当前最大的数就行)

关于已排好序的:
什么叫已排好序的呢(和最后的序列比较,从结尾开始一样次序的最长长度)
比如 14325786 78是已经排好序的
14326876 中只有8是已经排好序的,不是68,因为最后坑定是6678,6和8中间还有一个7,68不算拍好序列的

# include <bits/stdc++.h>
using namespace std;

const int MAXN=1e5+10;
int a[MAXN];
int aa[MAXN];
int main()
{
	int t;
	
	scanf("%d",&t);
	while(t--){
		int n;
		scanf("%d",&n);
		for(int i=0;i<n;i++){
			scanf("%d",&a[i]);
			aa[i]=a[i];
		}
		sort(aa,aa+n);
		int l=(n-1);
		for(int i=(n-1);i>=0;i--){
			if(a[i]==aa[l]){
				l--;
			}
		}
		int c;
		c=n-(n-1-l);
		printf("%d\n",c);
	}
	
	return 0;
}

B Element Swapping

看着学长的代码看了一个小时。。。还没看懂。。。
分别对改过的,没改过的算一遍x,xx,y,yy,然后可以求出ak1+ak2
我也不知道我写清楚没,凑活着看吧。。。
然后对求出来的s1,s2分类;接着对a1a2进行分类;具体的看代码吧,(我也不知道能不能讲清楚,有点绕)
在这里插入图片描述

# include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const LL MAXN=1e5+10;
LL b[MAXN];
int main()
{
	int t;
	
	scanf("%d",&t);
	while(t--){
		LL n,x,y;
		LL xx=0,yy=0;
		
		scanf("%lld %lld %lld",&n,&x,&y);
		for(int i=1;i<=n;i++){
			scanf("%lld",&b[i]);
			xx+=(i*b[i]);
			yy+=(i*b[i]*b[i]);
		}
		
		LL s1=x-xx,s2=y-yy; 

		map<LL,LL> ma;
		if(s1==0&&s2==0){//考虑是否另个都为0,如果是,那么交换的两个就是一样的数字 
			LL ans=0;
			for(int i=1;i<=n;i++){
				ans+=ma[b[i]];
				ma[b[i]]++;
			}
			printf("%lld\n",ans);
		}else if(s1==0||s2==0){//考虑是否有一个为0,如果是那么就不正确 
			printf("0\n");
		}else if(s2%s1!=0){//考虑是否能够整除,如果是,那么也不正确 
			printf("0\n");
		}else{//可以进行计算的情况 
			LL a1,k1,a2,k2,a1a2,dd;
			LL sum=0,c=s2/s1;
			for(LL i=1;i<=n;i++){//当前的i是变化后的 
				a1=b[i];//因为是以b[i]数组作为考量的,所以当前是变化后的k1,就是变化前的k2 
				a2=c-a1;
				a1a2=a1-a2;
				
				if(a1a2==0){//考虑两个数是否一样,如果一样,那么改情况上诉已经考虑过,这时候就不正确 
					continue;
				}
				if(s1%(a1-a2)!=0){//考虑是否能够整除的情况,如果不是那么就不正确 
					continue;
				} 
				dd=s1/a1a2;
				if((dd+i)>n||(dd+i)<1){//考虑是否超出范围的情况,如果是那么不正确 
					continue;
				}
				if((a1-a2)!=(b[i]-b[dd+i])){//验证是否一样,k1、k2是否符合 
					continue;
				}
				sum++;
			}
			printf("%lld\n",sum/2);
		}
		
	}
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值