题目传送门

A 发射站

B 翻译鸡

C 字符串

D 机器

T1 发射站

思路

暴力枚举可行的矩阵,再求其中的最大值

代码

#include<bits/stdc++.h>
using namespace std;
long long d,n,a[1111][1111],x,y,z,ma=-10000,jj;
int main(){
	freopen("fsz.in","r",stdin);
	freopen("fsz.out","w",stdout);
	cin>>d>>n;
	for(int i=1;i<=n;i++){
		cin>>x>>y>>z;
		a[x+1][y+1]+=z;
	}

	for(long long i=1;i<=129;i++){
		for(long long j=1;j<=129;j++){
			long long x=max((1ll),i-d),y=max((1ll),j-d);
			long long xx=min((129ll),i+d),yy=min((129ll),j+d);
			int s=0;
			for(int ii=x;ii<=xx;ii++){
				for(int j=y;j<=yy;j++){
					s+=a[ii][j];
				}
			}
			if(s==ma)jj++;
			if(s>ma)ma=s,jj=1;
		}
	}
	cout<<jj<<' '<<ma;
	return 0;	
}

错误与感想

在比赛中,我用的是二维前缀和,但用的有误搜易只拿了70分

以后要看题面去分析,可以想简单点就行简单点,不要出现这样的丢分

注:此题为暴力

T2翻译鸡

思路

思路见 陈室先的总结7.19day11:小W的病毒歼灭战

代码也是!!

算了

讲一下吧

就一下
  1. 先输入,然后再逐个处理(记得建个桶)
  2. 每次输入单词
  3. 如果是字典中有的单词,跳过
  4. 没有的话判断
  5. 如果容量满了就出队,那个词也要从桶中去标记
  6. 然后入队,桶标记,计数变量+1
  7. 输出 注:此题为队列

代码

#include<bits/stdc++.h>
using namespace std;
int n,m,st[1111],q[111111],h=0,t=-1,j=0,x;
int main(){
	freopen("fyj.in","r",stdin);
	freopen("fyj.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>x;
		if(st[x]==0){
			if(t-h+1==n){
				st[q[h]]--;
				h++;
			}
			j++;
			q[++t]=x;
			st[x]++;
		}
	}
	cout<<j;
	return 0;	
}

T3字符串

思路

/*
是不是'-'
	是{
		左右都是数字{
			是降序或等于 直接输出
			差为1 跳过	
			都不是{
				是星号 算数量输出	
				不是{
					是正序 正序输出
					不是  正序输出
				}
			}
		}
		左右都是字母{
			是降序或等于 直接输出
			差为1 跳过	
			都不是{
				是星号 算数量输出	
				不是{
				是正序 正序输出
				不是  正序输出
			      }
		      }
	        }
		都不是 直接输出
	}
	不是 直接输出
*/

注:此题为字符串处理

代码

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

T4机器

思路

思路很简单,就是找坑补坑

  1. 我们扫描所有操作
  2. 求出编号,第几步,那个机器,多少时间
  3. 从上一次加工时间+1开始,找到加工时间足够的空就填上去,更新

代码

#include<bits/stdc++.h>
using namespace std;
int n,m,sx[444],jq[25][25],sj[25][25],st[25][7777],ss=0;
struct P{
	int id=0,ww=0;
}la[444];
int main(){
	freopen("jq.in","r",stdin);
	freopen("jq.out","w",stdout);
	cin>>m>>n;
	for(int i=1;i<=n*m;i++)cin>>sx[i];
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>jq[i][j];
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>sj[i][j];
	for(int i=1;i<=n*m;i++){
		int no=sx[i];
		int h=++la[no].id;
		int j=jq[no][h];
		int s=sj[no][h];
		int k=0;
		for(int r=la[no].ww+1;;r++){
			if(st[j][r]==0)k++;
			else k=0;
			if(k>=s){
				for(int b=r-k+1;b<=r;b++){
					la[no].ww=r;
					st[j][b]=1;
					ss=max(ss,r);
				}
				break;
			}
		}
	}
	cout<<ss;
	return 0;	
}

错误与感想

这道题在比赛中没写,结果补题时自己写的代码特长,还##wa了,按老师思路写结果数据范围开小了,好不容易调好,发现交了几次24次!!!!!

以后要注意数据范围,不能再犯这样的低级错误,也不能再调这么久!!!

注:此题为模拟