8月集训 DAY9

发射站

错误原因

(*  ̄︿ ̄)数组越界了!!!

思路

用二维前缀和,枚举每一个点,找到最大值 在枚举每一个点 找有多少个和最大值一样的点.

代码

#include<bits/stdc++.h>
using namespace std;
long long  a[180][180],f[180][180];
int main()
{
	freopen("fsz.in","r",stdin);
	freopen("fsz.out","w",stdout); 
	long long d,n,x,y,k,ans=0,cnt=0;
	cin>>d;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>x>>y>>k;
		a[x+20][y+20]=k;
	}
	for(int i=1;i<=179;i++)
	{
		for(int j=1;j<=179;j++)
		{
			f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+a[i][j];
		}
	}
	for(int i=20;i<=148;i++)
	{
		for(int j=20;j<=148;j++)
		{
			ans=max(ans,f[i+d][j+d]-f[i-d-1][j+d]-f[i+d][j-d-1]+f[i-d-1][j-d-1]);
		}
	}
	for(int i=20;i<=148;i++)
	{
		for(int j=20;j<=148;j++)
		{
			if(ans==(f[i+d][j+d]-f[i-d-1][j+d]-f[i+d][j-d-1]+f[i-d-1][j-d-1])) cnt++;
		}
	}
	cout<<cnt<<" "<<ans;
}

翻译鸡

错误原因

思路

用一个队列 每次遍历队列 如果找不到入队并且cnt++ 同时如果达到内存上限 队头出队

代码

#include<bits/stdc++.h>
using namespace std;
int b[1010],a[1010],tt=-1,hh=0;
int main()
{
	freopen("fyj.in","r",stdin);
	freopen("fyj.out","w",stdout); 
	int n,m,flag=0,cnt=0;
	cin>>m>>n;
	for(int i=1;i<=n;i++)
	{
		flag=0;
		cin>>b[i];
		for(int j=hh;j<=tt;j++) if(a[j]==b[i]) flag=1;
		if(!flag)
		{
			if(tt-hh+1>=m) hh++;
			a[++tt]=b[i]; 
			cnt++;
		}
	}
	cout<<cnt;
}

字符串

错误原因

思路

按题意模拟即可

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
	freopen("zfc.in","r",stdin);
	freopen("zfc.out","w",stdout);
	string s,s2;
	int p1,p2,p3;
	cin>>p1>>p2>>p3;
	cin>>s;
	for(int i=0;i<s.size();i++)
	{
		if(s[i]=='-'&&(s[i-1]>=97&&s[i+1]>=97||s[i-1]>=48&&s[i-1]<=57&&s[i+1]>=48&&s[i+1]<=57)&&s[i-1]<s[i+1])
		{
			if(s[i-1]+1==s[i+1]) continue;
			if(p1==1)
			{
				if(p3==1) for(int j=int(s[i-1]+1);j<int(s[i+1]);j++) for(int k=1;k<=p2;k++) s2+=char(j);
				else  for(int j=int(s[i+1]-1);j>=int(s[i-1]+1);j--) for(int k=1;k<=p2;k++) s2+=char(j);
			}
			else if(p1==2)
			{
				if(p3==1)
				{
					if(s[i-1]>=97) for(int j=int(s[i-1]+1-32);j<int(s[i+1]-32);j++) for(int k=1;k<=p2;k++) s2+=char(j);
					else for(int j=int(s[i-1]+1);j<int(s[i+1]);j++) for(int k=1;k<=p2;k++) s2+=char(j);
				}
				else
				{
					if(s[i-1]>=97) for(int j=int(s[i+1]-1-32);j>=int(s[i-1]+1-32);j--) for(int k=1;k<=p2;k++) s2+=char(j);
					else for(int j=int(s[i+1]-1);j>=int(s[i-1]+1);j--) for(int k=1;k<=p2;k++) s2+=char(j);
				}
			}
			else for(int j=int(s[i+1]-1);j>=int(s[i-1]+1);j--) for(int k=1;k<=p2;k++) s2+='*';
		}
		else s2+=s[i];
	}
	cout<<s2;
}

机器

思路没想到的原因

样例都没看懂

思路

遍历每个工序, 用step[i]来代表工件i现在的工序,now将这个工件备份 ll来代表这个工件的这个工序所用的时间 zz来代表来代表这个工件的这个工序的加工的机器数 last[i]来代表工件i上一个工序的完成时间 t[i][j]来表示第i个工件的第j单位时间

从last[now]+1开始直到空余的时间能大于ll 就把这一段时间标记为不空余的时间 ans=max(ans,现在的时间) 输出ans

代码

#include<bits/stdc++.h>
using namespace std;
int ans=0,t[30][7000],step[30],last[30],ori[410];
struct node
{
	int tm;
	int jiqi;
};
node a[410][410];
int main()
{
	freopen("jq.in","r",stdin);
	freopen("jq.out","w",stdout);
	int m,n;
	cin>>m>>n;
	for(int i=1;i<=m*n;i++) cin>>ori[i];
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>a[i][j].jiqi;	
		}	
	} 
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>a[i][j].tm;	
		}	
	}
	for(int i=1;i<=n*m;i++)
	{
		int now=ori[i];
		int k=++step[now];
		int ll=a[now][k].tm;
		int zz=a[now][k].jiqi;
		int s=0;
		for(int q=last[now]+1;;q++)
		{
			if(t[zz][q]==0) s++;
			else s=0;
			if(s>=ll)
			{
				for(int h=q-s+1;h<=q;h++)
				{
					t[zz][h]=1;
					last[now]=h;
					ans=max(ans,h);
				}
				break;
			}
		}
	}
	cout<<ans;
}