A. 发射站

思路

对于这题我们可以循环遍历正方形的中心坐标,并循环求覆盖点的总和。 注意方案数量和越界问题,这是我们就会想了:这么写会不会超时呢?实际上是不会的,因为本题数据范围很小,所以不用二维前缀和来优化。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=2e2+10;
int a[N][N];
int main(){
	freopen("fsz.in","r",stdin);
    freopen("fsz.out","w",stdout);
	int d,n;
	cin>>d>>n;
	for(int i=1;i<=n;i++){
		int x,y,k;
		cin>>x>>y>>k;
		a[x][y]=k;
	}
	int ans=0,cnt=0;
	for(int i=d;i<=128-d;i++)
		for(int j=d;j<=128-d;j++){
			int sum=0;
			for(int k=i-d;k<=i+d;k++){
				for(int t=j-d;t<=j+d;t++) sum+=a[k][t];
			}
			ans=max(ans,sum);
		}
	for(int i=0;i<=128;i++)
		for(int j=0;j<=128;j++){
			int sum=0;
			for(int k=i-d;k<=i+d;k++){
				for(int t=j-d;t<=j+d;t++) if(k>=0&&t>=0) sum+=a[k][t];
			}
			if(sum==ans) cnt++;
		}
	cout<<cnt<<" "<<ans; 
	return 0;
}

对于这道题目我在考试的时候想到了用二维前缀和来做,但是不知道怎么做,所以就放弃了,下一次一定不能轻易放弃,同时也要再巩固一下二维前缀和的实际应用。

B. 翻译鸡

思路

对于这道题目我们稍加观察即可发现,本题其实和七月暑期集训DAY11小W的病毒歼灭战是一样的,所以按照小W的病毒歼灭战这题的思路来写即可。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10,M=1e2+10;
int a[N],b[M];
int main(){
	freopen("fyj.in","r",stdin);
	freopen("fyj.out","w",stdout);
	int m,n,ans=0,idx=1;
	cin>>m>>n;
	for(int i=1;i<=m;i++) b[i]=1010;
	for(int i=1;i<=n;i++){
		bool flag=0;
		cin>>a[i];
		for(int j=1;j<=m;j++){
			if(a[i]==b[j]){
		    	flag=1;
		    	break;
			}
		} 
		if(!flag){
			b[idx]=a[i];
			idx++;
			if(idx>m) idx=1;
			ans++;
		}
	}
	cout<<ans;
	return 0;
}

本题已AC,下一次还需要继续努力。

C. 字符串

思路

对于这道题目我们分类讨论即可,分类如下:

  • p1情况:
  • 等于1,将字符串改为小写。
  • 等于2,将字符串改为大写。
  • 等于3,不论是字母子串还是数字字串,都用与要填充的字母个数相同的星号*来填充
  • 然后遍历循环p2次,中间可能出现的情况如下:
  • 如果减号右边的字符恰好是左边字符的后继,只删除中间的减号。
  • 如果减号右边的字符按照ASCII码的顺序小于或等于左边字符,输出时,要保留中间的减号。
  • 若同为数字或字母,连续输出。
  • p3情况:
  • 等于1, 表示维持原来顺序。
  • 等于2,表示采用逆序输出,注意这时候仍然不包括减号两端的字符。

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	freopen("zfc.in","r",stdin);
	freopen("zfc.out","w",stdout);
	int p1,p2,p3;
	cin>>p1>>p2>>p3;
	string s,s1,s2,s3;
	cin>>s;
	if(p1==1){
		for(int i=0;i<s.size();i++){
			if(s[i]>='A'&&s[i]<='Z') s3+=s[i]+32;
			else s3+=s[i];
		}
	}
	if(p1==2){
		for(int i=0;i<s.size();i++){
			if(s[i]>='a'&&s[i]<='z') s3+=s[i]-32;
			else s3+=s[i];
		}
	}
	if(p1==3){
		for(int i=0;i<s.size();i++) s3+=s[i];
		for(int i=0;i<s.size();i++){
		    if(s[i]=='-'&&i!=0&&i+1!=s.size()){
				if(s[i-1]+1==s[i+1]) continue;
				else if(s[i+1]<=s[i-1]) s1+='-',s2+='-'; 
				else if((s[i+1]>='0'&&s[i+1]<='9'&&s[i-1]>='0'&&s[i+1]<='9')||
				(s[i+1]>='a'&&s[i+1]<='z'&&s[i-1]>='a'&&s[i+1]<='z')||
				(s[i+1]>='A'&&s[i+1]<='Z'&&s[i-1]>='A'&&s[i+1]<='Z')){
					for(char j=s3[i-1];j<s3[i+1];j++){
						int p4=p2;
						while(p4--&&j!=s3[i-1]) s1+='*',s2+='*';
		  	    	}
				}
				else s1+='-',s2+='-';
			}
			else s1+=s[i],s2+=s[i];
		}
	}
	if(p1!=3){
		for(int i=0;i<s.size();i++){
		    if(s[i]=='-'&&i!=0&&i+1!=s.size()){
				if(s[i-1]+1==s[i+1]) continue;
				else if(s[i+1]<=s[i-1]) s1+='-',s2+='-'; 
				else if(s[i+1]>='0'&&s[i+1]<='9'&&s[i-1]>='0'&&s[i+1]<='9'||
				s[i+1]>='a'&&s[i+1]<='z'&&s[i-1]>='a'&&s[i+1]<='z'||
				s[i+1]>='A'&&s[i+1]<='Z'&&s[i-1]>='A'&&s[i+1]<='Z'){
				    for(char j=s3[i-1];j<s3[i+1];j++){
						int p4=p2;
						while(p4--&&j!=s3[i-1]) s1+=j;
					}
					for(char j=s3[i+1]-1;j>s3[i-1];j--){
						int p4=p2;
						while(p4--&&j!=s3[i+1]) s2+=j;
					}		
				}
				else s1+='-',s2+='-';
			}
			else s1+=s[i],s2+=s[i];
		}
	}
	if(p3==1) cout<<s1;
	if(p3==2) cout<<s2;
	return 0;
}

在考试的时候我们的代码之所以得了40分,是因为代码出现了2个BUG:

  • p1=3,没将s3存进去。
  • 没考虑不同为数字或字母的问题。

D. 机器

思路

由于一道工序有多种数据,而我们又无法改变加工顺序,因此只能用多个数组分别记录在什么时间,在哪个机器,是什么零件。 但是还有一个问题,那就是我们无法知道现在是第几个工序,因此需要用一个桶记录每个零件的加工次数。 因为必须先进行前面的工序在进行后面的工序,所以还需要一个数组来记录第i个零件上一次在什么时候加工。 再用一个数组记录加工情况,每次从上一次加工结束处遍历这个数组,直到找到一个长度大于这道工序所需时间,那就将其从这个长度开始,到工序所需时间结束标为已加工,并记录下加工结束时间, 同时更新时间的最大值,最后输出即可。

代码

#include<bits/stdc++.h>
using namespace std;
int a[30][30],t[30][30],st[410],c[30],last[30],mk[30][8010],mx=0;
void fd(int x,int y){
	int idx=a[x][y],ti=t[x][y],len=0;
	for(int i=last[x]+1;;i++){
		if(mk[idx][i]==0) len++;
		else len=0;
		if(len==ti){
			for(int j=i-len+1;j<=i;j++) mk[idx][j]=x;
			last[x]=i;
			mx=max(mx,i);
			return ;
		}
	}
}
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>>st[i];
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j];
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>t[i][j];
	for(int i=1;i<=m*n;i++){
		c[st[i]]++;
		fd(st[i],c[st[i]]);
	}
	cout<<mx;
	return 0;
}

没有时间了,所以没做这题,下次要提高做题速度。