蓝桥杯备赛 Day9 构造

构造

1.要点

考察总结归纳能力,没有固定解法

2.题目

2023平方差

(1)找到规律先存到set里面,然后要考虑最大开到1e6,然后暴力能得70分
(2)再观察规律,y为奇数或者偶数,z为奇数或者偶数,可以得到满足条件的为奇数和4的倍数,但是遍历会超时,可以类似于前缀和思想,求[1,r]满足条件总和-[1,l-1]满足条件总和,奇数个数为(x+1)/2(例如1,3,5,7,x=7+1=8/2=4,x=8+1=9/2=4),4的倍数个数为x/4(例如4,8,x=8/4=2,x=9/4=2)
代码;

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
ll l,r;

ll get_num(ll x){ //输入和输出都为ll
	return (x+1)/2+x/4;
}

int main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>l>>r;
	ll cnt=get_num(r)-get_num(l-1);
	cout<<cnt;
	return 0;
} 
2018倍数问题

学习:
(1)先暴力,不过要尽可能加多一点break条件,避免超时

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int N=1e5+10;
ll a[N],n,K,i,j,k,maxn;

int main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>n>>K;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	sort(a,a+n);
	for(i=n-1;i>=2;i--){
		j=i-1,k=i-2;
		if(a[i]+a[j]+a[k]<maxn)	break; //break
		for(j=i-1;j>=1;j--){
			k=j-1;
			if(a[i]+a[j]+a[k]<maxn)	break;  //break
			for(int k=j-1;k>=0;k--){
				if((a[i]+a[j]+a[k])%K==0){
					maxn=max(maxn,a[i]+a[j]+a[k]);
				}
				if(a[i]+a[j]+a[k]<maxn)	break; //break
			}
		}	
	}
	cout<<maxn;
	return 0;
}