20天集训——day8

今天是考试,考题是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;
}
 



猜你喜欢

转载自blog.csdn.net/wangzhuojia/article/details/81005340