【总结】纪中Day6比赛总结

纪中Day6比赛总结


今天果然爆掉了。只有130分,排名掉了20多。T1直接眼睛瞎掉,硬生生地把一个01背包打成了暴力,30分。第三题没找着规律,果然我数论就是菜啊。T4还想拿一点部分分,结果一分没拿到。

T1

在这里插入图片描述

01背包,差不多是个模板题吧,只是要多判断一下重要度。

Code

#include<iostream>
#include<iomanip>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<string>
using namespace std;
int te[30010],p[30010],alltime,n,allp[30010],maxn=0;
void input()
{
	cin>>alltime>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>p[i]>>te[i];
	}
	return;
}
int main()
{
	freopen("happy.in","r",stdin);
	freopen("happy.out","w",stdout);
	input();
	for(int i=1;i<=n;i++)
	{
	    for(int j=alltime;j>=1;j--)
	     if(j>=p[i])
	     {
	  	    allp[j]=max(allp[j],allp[j-p[i]]+te[i]*p[i]);
	     }
	     if(allp[alltime]>maxn) maxn=allp[alltime];
	}
	cout<<maxn;
	fclose(stdin);
	fclose(stdout);
	return 0;
}

T2

在这里插入图片描述

这道题其实和昨天做的火星人差不多,只不过是多了一个将字符串变为数字串的过程。然后再用全排列的方法求出后面的五个数。

Code

#include<iostream>
#include<iomanip>
#include<cstdio>
using namespace std;
int n,m,a,b[1005],d,t,k;
char s;
int main()
{
	freopen("count.in","r",stdin);
	freopen("count.out","w",stdout); 
	cin>>n>>m>>a;
	for(int i=1;i<=a;i++)
	{
		cin>>s;
		b[i]=s-'a'+1;
	}
	for(int i=1;i<=5;i++)
	{
	    if(b[a]!=m)
		 {
		 b[a]++; 
		 for(int j=1;j<=a-1;j++)
		  cout<<char(b[j]+'a'-1);
		 cout<<char(b[a]+'a'-1)<<endl; 
         continue;
	    } 
		d=0;
        t=0;
       	for(k=a-1;k>=1;k--)
       	{
       		t++;
       		if(b[k]!=m-t){
			   t=1;break;
			   }
       	}
       	if(t==1)
       	{
       		b[k]++;
       		for(int j=k+1;j<=a;j++)
       		 b[j]=b[j-1]+1;
			for(int j=1;j<=a;j++)
			  cout<<char(b[j]+'a'-1);
			 cout<<endl;  
        }    
   }
   fclose(stdin);
   fclose(stdout);
   return 0;
}

T3

在这里插入图片描述

这道题需要我们去找规律。我们观察题目,发现每一个需要多个数相加的项,其实都是由在它之前并且离它最近的唯一幂(单纯的k的幂)与唯一幂前面的每一个数相加而成的。
例如题中给出数列的第五项(30+32),其实就是由在它前面并且最近的唯一幂32加上唯一幂前的第一项30得到的,以此类推,后面每一项都是如此(就等于k的幂)。

Code

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<iomanip>
using namespace std;
long long a[1000];
int main()
{
	freopen("sequence.in","r",stdin);
	freopen("sequence.out","w",stdout);
	int n,k,m,j,i;
	cin>>k>>n;
	m=j=1;
	i=2;
	a[1]=1;
	while(i<=n)
	{
		if(j==m)
		{
		    a[i]=a[m]*k;
		    m=i;
		    j=1;
	    }
	    else
	    {
	    	a[i]=a[m]+a[j];
	    	j++;
		}
		i++;
	}
	cout<<a[n];
	fclose(stdin);
	fclose(stdout); 
    return 0;
}

T4

在这里插入图片描述
在这里插入图片描述

还未做出

总结

今天做得真的不行,题目看错了(主要是我dp没掌握好),而且T3比赛时的代码实现也出了问题,T4的快速幂不会打,而且也没想出思路。要尽快熟练掌握DFS和DP了
本人csdn博客


谢谢阅读

posted @ 2021-07-18 20:05  基德不基  阅读(28)  评论(0编辑  收藏  举报