&&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