今天是考试,考题是d组的大佬出的,我考得奇差无比。就好像这几天都没学到东西一样,考了全部人的倒数。感觉辜负了岳老师对我们的期望。这考题题目名是二分的测试,其实是递归和递推的测试,就只有一道题是二分。
第一题:一个人有n个糖,每经过一个人就要将他手中的糖分出去一般,但这个人又会还给此人1颗。 这题是用递推写的,但我少写了一个剪枝,就少了70分
#include<bits/stdc++.h>
using namespace std;
int main()
{
freopen("station.in","r",stdin);
freopen("station.out","w",stdout);
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++)//经过m个人
{
n=n-n/2+1;//给别人一半,又还给此人1颗
if(n==2||n==3) break;//当n=2或3时会给出一颗,又还回来1颗,糖数不变可以剪枝直接退出循环。
}
cout<<n;
return 0;
}
第二题:一个人走楼梯,到奇数级台阶时可以走1或4级,到偶数级台阶时可以走2或3级。问1~n级的方案数 我题是会写,但把推出来的递推公式写成了递归,然后我就呵呵了。
#include<bits/stdc++.h>
using namespace std;
long long a[51000000];
int main()
{
freopen("stairs.in","r",stdin);
freopen("stairs.out","w",stdout);
int n;
cin>>n;
a[0]=0;a[1]=0;a[2]=1;a[3]=1;//a[0]=0没有台阶可以到达0级台阶,a[1]=0:0级台阶无法到达1级台阶,a[2]=1:0可以到2…… for(int i=4;i<=n;i++)
{
if(i%2==0)
a[i]=(a[i-1]+a[i-2])%1000000007;//因为奇数+奇数=偶数,偶数+偶数=偶数,所以奇数=偶数-奇数,偶数-偶数=偶数
else
a[i]=(a[i-3]+a[i-4])%1000000007;//近似等于上方
}
cout<<a[n]<<endl;
return 0;
}
第三题:有“cat”的字符串,每过一个单位长度,该字符串复制一遍,在复制出的字符串中加时间长度-1个a再按该字符继续反复操作,问第 i 位为什么,什么时候出现了这位。
#include <bits/stdc++.h>
using namespace std;
int n,dp[30],s,k,k1;
void find(int s,int k)
{
if (s==1) {cout<<"c ";return;}
if (s==2) {cout<<"a ";return;}
if (s==3) {cout<<"t ";return;}
if (s>dp[k-1])
{
if (s<=dp[k-1]+k-1) //在那一堆a中
{
cout<<"a ";
return;
}
else find(s-(dp[k-1]+k-1),k-1);//在复制的后半段中
}
else find(s,k-1);
return ;
}
int main()
{
freopen("cat.in","r",stdin);
freopen("cat.out","w",stdout);
cin>>n;
dp[1]=3;
for (int i=2;i<=27;i++)//过了几个单位长度才出现该字母
dp[i]=dp[i-1]*2+i-1;
for (int i=1;i<=n;i++)
{
cin>>s;
k=1;
while (s>dp[k]) k++;
find(s,k);
cout<<k<<endl;
}
return 0;
}
第四题:有n个糖分给m个人,每个人必须要有以个,问有几种分发。 我考试是理解错了,就没打这题,感觉样例是错的推不出来。
#include<bits/stdc++.h>
using namespace std;
int n,m,l=0;
void h(int a,int b,int c)//a为糖剩余数,b为以分到糖的猴子数
{
if(a<0) return ;
if(a<m-b) return ;//糖不够分
if(a==0)
{
if(b==m)
l++;
l%=1000000007;
return ;
}
for(int i=c;i>=1;i--)
h(a-i,b+1,i);
}
int main()
{
freopen("monkey.in","r",stdin);
freopen("monkey.out","w",stdout);
cin>>n>>m;
for(int i=n-m+1;i>=1;i--)
h(n-i,1,i);
cout<<l;
return 0;
}