纪中Day7比赛总结
今天发挥的有些差。T3的模拟有许多特殊情况没有考虑到,导致只得了T3只得了30分,第二题其实可以直接暴力的,可惜没看出来。最终得分130分。
T1
思路
这道题就是将环形DP转成线性DP,最后变为区间DP,需要用到三维数组。
T2
思路
因为本蒟蒻太菜了,没有听懂,但是kyx巨爷竟然也没有听懂。
根据题目我们可以得出下面的式子:
ax+by=c。
然后我们要求出x和y,再找出最大值和最小值
AC做法好像是扩展欧几里得啥的。
T3
思路
这道题直接暴力模拟就能过。
首先我们先判断初始的m能进行几次闪烁魔法,然后算出使用闪烁魔法后剩下的魔力。接着再循环中,我们处理三种可能性:1、m==0;2、2<=m<=5;3、5<m<10。
首先是第一种情况。当m=0时,我们用掉5秒可将魔力回复到20,然后用两秒进行了2次闪烁魔法。那么我们就等于用了7秒走了120米。如果是跑步,7秒我们只能走119米。所以我们选择魔法。
第二种情况。我们需要休息两秒就能恢复魔力到10,再用一秒进行闪烁魔法。就是相当于3秒走了60米。而跑步3秒只能走51米。选择魔法。
第三种情况。我们只需要恢复一秒就能将魔力恢复到大于10,再用一秒进行闪烁魔法。相当于2秒走了60米。而跑步则只能走34米。选择魔法。
当然,这三种可能都需要判断时间是否足够,如果不够就只能选择跑步。
最后我们还需要特判一种可能:你的魔力未达到10,你回复魔力的时间加上闪烁魔法的时间还充足,但是剩下的路程走路就可以到达。这种情况我们选择走路。
Code
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
freopen("escape.in","r",stdin);
freopen("escape.out","w",stdout);
int m,far,t,ss,wfar=0,hf=0,k;
// minn=0;
cin>>m>>far>>t;
k=t;
ss=m/10;
if(ss<=t)
{
wfar=60*ss;
t=t-ss;
m=m%10;
}
else
{
wfar=t*60;
t=0;
m=m-(t*10);
}
while(t>0&&wfar<far)
{
hf=10-m;
if(hf%4!=0)
hf++;
else hf=hf/4;
if(t-(hf+1)>0)
{
if((hf+1)*17<60)
{
wfar+=60;
t=t-(hf+1);
m=m-10;
}
else
{
wfar+=(hf+1)*17;
t=t-(hf+1);
}
}
else
{
wfar+=17;
t--;
}
}
if(wfar>=far)
{
cout<<"Yes"<<endl;
cout<<k-t;
}
else
{
cout<<"No"<<endl;
cout<<wfar;
}
fclose(stdin);
fclose(stdout);
return 0;
}
T4
思路
汉诺塔,相信大家小时候都玩过。
我们在草稿本上列出1~4次最少挪动次数,可以得出下表:
数量: 挪动次数:
1 2
2 6
3 14
4 30
我们观察上表,就可以发现:当前的挪动次数其实就是上一次(挪动次数+1)*2。那么我们就可以列出递推式:
f
[
n
]
=
2
(
f
[
n
−
1
]
+
1
)
f[n]=2(f[n-1]+1)
f[n]=2(f[n−1]+1)。
但是,我们观察数据范围,N<=200。绝对会超过long long的范围,所以我们需要用到高精度。
Code
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1001;
int a[maxn],k=2,n;
char str1[maxn];
void input()
{
cin>>n;
memset(a,0,sizeof(a));
a[maxn-1]=2;
}
void add()
{
int g=0;
a[maxn-1]++;
for(int i=maxn-1;i>0;i--)
{
a[i]=a[i]*2+g;
g=a[i]/10;
a[i]=a[i]%10;
}
}
void work()
{
for(int i=1;i<n;i++)
add();
}
void output()
{
int i=1;
while(a[i]==0&&i<maxn) i++;
for(int j=i;j<maxn;j++)
cout<<a[j];
}
int main()
{
freopen("hanoi.in","r",stdin);
freopen("hanoi.out","w",stdout);
input();
work();
output();
fclose(stdin);
fclose(stdout);
return 0;
}
总结
模拟的特殊情况判断少了,T2的题目式子没有推出来。