一.考试注意事项

1.先在桌面新建文件夹 按自己的考号建文件夹 根据四个题目的文件名,再建四个文件夹 四个文件夹里分别建cpp文件 2.文件读写,建文件就写好,最后提交前再检查一下 3.开long long 4.后面的题目也要尝试拿部分分

二.比赛成绩分析

T1:50分,次快,约10分钟 T2:70分,最快,约8分钟 T3:0分,次慢,约1小时 T4:50分,最慢,约1个半小时 明天考试目标AK

三.四个题目的总结

T1: 错误原因:没开long long 思路:找到公式:(n/2+1)*(n%(n/2+1)) T2: 错误原因:没有取0 思路:循环去取 T3: 错误原因:前缀和写错了 思路:写前缀和取区间武器和 代码:

#include <bits/stdc++.h>
using namespace std;
int n,a[100010],c[100010];
int m,cnt,mp[450][100010],b[450];
int zh(int x,int y)
{
	if(x==1) return y;
	if(x==2) return y*(y-1)/2;
	if(x==3) return y*(y-1)*(y-2)/6;
	if(x==4) return y*(y-1)*(y-2)*(y-3)/24;
}
int main()
{
//	freopen("wq.in","r",stdin);
//	freopen("wq.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		if(a[i]>n) continue;
		c[a[i]]++;
		if(c[a[i]]==a[i])
		{
			b[++cnt]=a[i];
		}
	}
	for(int i=1;i<=cnt;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(a[j]==b[i]) mp[i][j]=mp[i][j-1]+1;
			else mp[i][j]=mp[i][j-1];
		}
	}
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		int l,r,k,sum=0;
		cin>>l>>r>>k;
		for(int j=1;j<=cnt;j++)
		{
			if(mp[j][r]-mp[j][l-1]>=b[j]) sum++;
		}
		cout<<zh(k,sum)<<endl;
	}
	return 0;	
} 
}

T4: 错误原因:只写了部分分代码(实际是想做满分,但只过了50分的) 思路:递归(+记忆化搜索)去找对应括号及代价,分治思想 代码:

#include <bits/stdc++.h>
using namespace std;
int n,color[3];
int R[1010],book[1010][1010][3][3];
string s;
int dfs(int n,int m,int x,int y)
{
	if(R[n]==m&&x!=y) return -2e9;
	if(n+1==m) return color[x];
	if(book[n][m][x][y]>=0) return book[n][m][x][y];
	int maxx=0;
	if(R[n]==m) 
	{
		for(int i=0;i<3;i++)
		{
			for(int j=0;j<3;j++)
			{
				if(i==x||j==y) continue;
				maxx=max(maxx,color[x]+dfs(n+1,m-1,i,j));
			}
		}
	}
	else
	{
		for(int i=0;i<3;i++)
		{
			if(i==x) continue;
			maxx=max(maxx,dfs(n,R[n],x,x)+dfs(R[n]+1,m,i,y));
		}
	}
	book[n][m][x][y]=maxx;
	return maxx;
}
int main()
{
//	freopen("bracket.in","r",stdin);
//	freopen("bracket.out","w",stdout);
	stack <int> z;
	memset(book,-1,sizeof book);
	cin>>n>>color[1]>>color[2]>>s;
	for(int i=0;i<s.size();i++)
	{
		if(s[i]=='(')
		{
			z.push(i);
		}
		else
		{
			int tmp=z.top();
			z.pop();
			R[tmp]=i;
		}
	}
	int ans=0;
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<3;j++)
		{
			ans=max(ans,dfs(0,n-1,i,j));
		}
	}
	cout<<ans;
	return 0;	
} 
}

0 条评论

目前还没有评论...