其他分享
首页 > 其他分享> > 【总结】纪中Day5比赛总结

【总结】纪中Day5比赛总结

作者:互联网

纪中Day5比赛总结


今天比赛突然蹦进了前十,连我自己都不敢相信(今天考那么好,明天rp必定爆掉
在这里插入图片描述

T1

在这里插入图片描述
在这里插入图片描述
看到这道题的第一眼,我以为要用DFS来做,又看到有一个最后必须回到道路,觉得有些难度,先去做了T3。
回来后,仔细看了一下题目,发现题中有下面这句话:

先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生

所以,这道题可以用暴力来做。用一个结构体保存植株的花生个数和它的坐标,然后以花生的个数从大到小排序。排完序后,从最大的开始,枚举从当前点到每一棵植株并且采摘、返回到路旁的时间是否足够,如果不足够,直接退出枚举,结束程序。

Code

#include<iostream>
#include<cstring> 
#include<algorithm>
using namespace std;
int n,m,k,t=0;
int money=0,p[30][30];
struct hs
{
	int x,y,num;
};
bool cmp(hs x1,hs y1)
{
	return x1.num>y1.num;
}
int main()
{
	hs a[500];
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=m;j++)
	 {
	    cin>>p[i][j];
	    if(p[i][j]!=0)
	    {
	    	t++;
	    	a[t].x=i;
	    	a[t].y=j;
	    	a[t].num=p[i][j];//记录植株的坐标以及花生数量
		}
	 }
	 sort(a+1,a+t+1,cmp);
	 for(int i=1;i<=t;i++)
	 {
	 	if(i==1)
	 	{
	 		if(a[i].x+1+a[i].x<=k)
	 		{
	 			money+=a[i].num;
	 			k=k-(a[i].x+1);
			}
			else break;
		}
		else
		{
			if(abs(a[i].x-a[i-1].x)+abs(a[i].y-a[i-1].y)+a[i].x+1<=k)//枚举每个植株
			{
				money+=a[i].num;
				k=k-(abs(a[i].x-a[i-1].x)+abs(a[i].y-a[i-1].y)+1);
			}
			else break;
		}
	 }
	cout<<money;
}

T2

在这里插入图片描述
在这里插入图片描述
这道题直接就是一个递归+二分,或者用双重循环也可以做。但无奈我太菜了,居然没想出来,直接打表了。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
string a,b;
char dg(int l,int r)
{
	int mid;
	char lt,rt,ans;
	if(l==r)
	{
		cout<<b[l];
		return b[l];
	}
	mid=(l+r)/2;
	lt=dg(l,mid);//二分查找左边
	rt=dg(mid+1,r);//二分查找右边
	if(rt==lt)
 	 ans=rt;
 	else ans='F';
 	cout<<ans;
 	return ans;//判断父节点并返回
}
int main()
{
    cin>>n;
    m=1;
    for(int i=1;i<=n;i++)
     m=m*2;
    cin>>a;
    for(int i=0;i<a.size();i++)
    {
    	if(a[i]=='1') b[i+1]='I';
    	else b[i+1]='B';
	}
	dg(1,m);
	return 0;
}

T2

在这里插入图片描述
一看题,蒟蒻狂喜。这不就是大水题吗?直接DFS就过掉了(正解全排列不会....)

Code

#include<iostream>
#include<cstdlib>
using namespace std;
int x,m,n,a[10005],b[10005];
bool f[10005];
void dfs(int dep)
{
	if(dep>n)
	{
		x++;
		if(x>m)//查看是第几大的数
		{
			for(int i=1;i<n;i++)
			 cout<<b[i]<<' ';
			cout<<b[n];
			exit(0);
	    }
	    return;
	}
	int k=1;
	if(x==0) k=a[dep];
	for(int i=k;i<=n;i++)
	 if(f[i]!=1)
	 {
	 	f[i]=1;
	 	b[dep]=i;
	 	dfs(dep+1);
	 	f[i]=0;
	 }
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	 cin>>a[i];
	dfs(1); 
}

T4

在这里插入图片描述
在这里插入图片描述
入眼一看,这不就是高精度吗?!但仔细一看,P那么大!肯定会超时,但无奈本蒟蒻太菜了,只能冲着部分分去了。最后的正解是高精度+快速幂。

Code

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int p,a[1010],t=0,k=0,b[1010];
void input()
{
	memset(a,0,sizeof(a));
	cin>>p;
}
void gjc()
{
	a[1000]=1;
	for(int i=1;i<=p;i++)
	{
		t=0;
		k=0;
		for(int j=1000;j>=1;j--)
		{
			k=(a[j]*2+t)/10;
			a[j]=(a[j]*2+t)%10;
			t=k;
		}
	}
}
void gjj()
{
	t=0;
	b[1000]=1;
	for(int j=1000;j>=1;j--)
	{
		if(a[j]-t-b[j]<0)
		{
			t=1;
			a[j]=a[j]*10-b[j];
		}
		else a[j]=a[j]-t-b[j];
	}
}
int main()
{
	input();
	gjc();
	gjj();
	k=0;
	for(int i=1;i<=1000;i++)
	{
		if(a[i]!=0)
		{
			k=i;
			break;
		}
	}
	cout<<1000-(k-1)<<endl;
	for(int i=501;i<=1000;i++)
	{
		cout<<a[i];
	}
	return 0;
} 

总结

总体还算不错,但是第一题有一个细节没考虑到,白给10分。个人感觉基础还算扎实,但是网络流什么的就有点拉胯了....
本人的csdn博客


谢谢阅读

标签:总结,int,void,Day5,花生,纪中,num,using,include
来源: https://www.cnblogs.com/ssllyw/p/15027490.html