【总结】纪中Day7比赛总结

博主分享了在编程竞赛中的表现和反思,指出在T3题目中因特殊情况判断不足导致失分,T2题目未能理解算法。文章解析了T1的三维DP转换思路,T3的模拟解法,以及T4的汉诺塔问题递推公式,并提供了代码实现。总结提到要加强特殊情况的考虑和算法理解。
摘要由CSDN通过智能技术生成

纪中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[n1]+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的题目式子没有推出来。


谢谢阅读

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值