1. 程式人生 > 其它 >【總結】紀中Day6比賽總結

【總結】紀中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部落格


謝謝閱讀