今日份模拟总结

&&miamiahaha


T1(cin,read(),read())

/*

易得果子数量:1 1+a 2+a 3+2a 5+3a 8+5a 13+8a 21+13a… 
	f[0]=0,f[1]=1;
	for(ri i=2; i<=20; i++) f[i]=f[i-1]+f[i-2];

	if(x%f[i]!=0) { printf("-1"); continue; }
	x/f[i]=num;

常量与变量系数关系:f1[i-1]=f[i] 

//mod 函数 
//事实证明,不需要 

*/ 

注:某些情况,long long的用时比int长(O当然不是这道题飞了的原因)

a/b>=2的时候,不写函数

while(cin>>a){ b=read(),c=read();}

这种多此一举的写法,不会减少时间,而且还很可能延长,两次实证

以下(是的,很短)

#include<bits/stdc++.h>
#define ri register int
#define ll long long
using namespace std;
ll a,b,x,ans,num,f[27]= {0,1 };
int main() {
	freopen("kela.in","r",stdin);
	freopen("kela.out","w",stdout);
	for(ri i=2; i<=21; i++) f[i]=f[i-1]+f[i-2];
	while(cin>>a>>x>>b) {
		if((x-f[a-1])%f[a]!=0) printf("-1\n");
		else printf("%lld\n",(x-f[a-1])/f[a]*f[b]+f[b-1]); }
	return 0; }

T2

真相很突然:手写数字串不合规(?)

易证,在第一次操作结束后的每一次操作只包含二个数字

void merge(int a[],int l int r,int mid) {
	int st[r-l+1];
	for(ri k=l; k<=r; k++) st[k-l]=a[k];
	for(ri i=l,j=mid+1,k=l; k<=r; k++)
		if(i>mid) a[k]=st[j-l];
		else if(j>r) a[k]=st[i-l],i++;
		else if(st[i-l]>st[j-l]) a[k]=st[j-l],j++;
		else a[k]=st[i-l],i++; }

void merge_sort(int a[],int l,int r) {
	if(l>=r) return;
	int mid=(l+r)/2;
	merge_sort(a,l,mid);
	merge_sort(a,mid+1,r);
	merge(a,l,r,mid); }
//第一次分段	
if(a[i]<a[ed]) ed=i;
else st=ed=i;
//归并 
reserve();
merge_sort();
//计算逆序对 
ans+=k-i+1;

T3

一串序号,每个序号有两个赋值,a,b

进行序号分段

保证每段最大值之和小于limit

求所有段中b值之和的最大值的最小值

首先二分,肉眼可见地“正向拔萝卜带nier”

之后,作为一个不是正解的草率的dfs

忽略了第一个号码和第二个有连接和断开两种状态

后附时间分配:

读T1,发现挺简单,直接写T1,过样例,大约30分钟

研究T2,草算了之后,认为和相对位置有关,但自觉要飞,于是去了T3

想的T3思路觉得挺清晰,但实操惊人,过了样例后,推不下T2,然后手痒敲了几段


over

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值