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]唯一化。之后模拟即可。