2019湖南多校第二场

C、Hedwig's Ladder 

theme:给定以下格子地图,从左上角出发,给定要走的长度n,问有多少种不会走到重复点的走法?

solution:就是简单dp,画一个案例好好分析就行了。

首先从左上角出发,第一步要么往右要么往下。1)如果第一步往右,则转化为了k=n-1的走法了,n-1的所有走法n都支持,但要注意,对于从x=1出发的点,过程中所到的坐标不会<1,k-n时是从x=0出发,所以还得考虑终点为x=0,y=1的情况,而起点为x=1,y=0,终点为x=0,y=1,时当且仅当步数为偶数时有一种,即n-1为偶数,n为奇数。综上,这种情况下走法有f(n-1)+n&1种

2)第一步往下。这时第二步没选择只能往右,则完全转化为从x=0,y=1 出发,步数为n-2情况(终点可到出发点上方)。这种情况下走法有f(n-2)种

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
#define far(i,n) for(int i=0;i<n;++i)

int dp[1005];
int mod=10007;

void getDp()
{
    dp[1]=2;
    dp[2]=3;
    for(int i=3;i<=1000;++i)
        dp[i]=((dp[i-1]+dp[i-2])%mod+(i&1))%mod;
}

int main()
{
    int p;
    cin>>p;
    getDp();
    while(p--)
    {
        int now,n;
        scanf("%d%d",&now,&n);
        printf("%d %d\n",now,dp[n]);
    }
}

F、Left-Right-Win

theme:n个人围成一个圈玩游戏,游戏过程为传输一个设备,这个设备可能转出三个值Left、Right、Win,转出这三个值分别的概率已知,当某个人转到Win则获得100元,游戏结束,转到Left、Right则分别传递给左右边的人,(若传递超过2^n次,则游戏也结束),问最终概率下第k个人(游戏从编号为0的人开始)能获多少钱?

 

A、Potato sacks

theme:p组案例,给定c,代表袋子的容量,给定10个土豆的重量,重量不超过3,问能否通过挑选土豆刚好将袋子装满。

solution:贪心:从重量为3的开始装,直到装完重量为3的或再装就超了的。

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;

int a[20];
int cnt[4];

int main()
{
    int p;
    cin>>p;
    while(p--)
    {
        cnt[0]=cnt[1]=cnt[2]=cnt[3]=0;
        int now,c;
        cin>>now>>c;
        cout<<now<<" ";
        for(int i=0;i<10;++i)
        {
            cin>>a[i];
            cnt[a[i]]++;
        }
        for(int i=0;i<cnt[3];++i)
        {
            if(c-3>=0)
                c-=3;
            else
                break;
        }
        for(int i=0;i<cnt[2];++i)
        {
            if(c-2>=0)
                c-=2;
            else
                break;
        }
        for(int i=0;i<cnt[1];++i)
        {
            if(c-1>=0)
                c-=1;
            else
                break;
        }
        if(!c)
            printf("YES\n");
        else
            printf("NO\n");
    }
}

H、Subprime function Sequence

theme:定义a[i]=sp(a[i-1]+a[i-2]),其中当x为质数时sp(x)=x,否则sp(x)=x/i,i为最小的能被x整除的质数。给定n,a[0],a[1],问最先开始出现重复,即存在k,m,k<m,使得a[k-1]=a[m-1],a[k]=a[m],输出k,(m-k),与a[k-1]~a[m]

solution:先得到所有a[0~n],为找到再次出现的连续两位数,考虑将连续两数捆绑起来唯一:令b[i]=a[i]*1000+a[i+1],因为a[i]在(0,1000],假设a<b,a,b都为整数,则1000*a比1000*b至少小1000,而c,d差不会>=1000,所以a*1000+c不可能等于b*1000+d,所以由这个式子可以将a[i],a[i+1]唯一化。之后模拟即可。

猜你喜欢

转载自blog.csdn.net/wangqianqianya/article/details/88651551
今日推荐