1.发射站

思路

暴力枚举!!

代码

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

2.翻译坤

思路

暴力

代码

#include<bits/stdc++.h>
using namespace std;
queue<int> a; 
unordered_map<int,bool> mp;
int main(){
	freopen("fyj.in","r",stdin);
	freopen("fyj.out","w",stdout);
	int m,n;
	cin>>m>>n;
	long long ans=0;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		if(mp[x]==0){
			if(a.size()==m){
				mp[a.front()]=0;
				a.pop();
				a.push(x);
				mp[x]=1;
			}else{
				a.push(x);
				mp[x]=1;
			}
			ans++;
		}
	}
	cout<<ans;
	return 0;
}

3. 字符串

思路

大模拟!!

具体思路
  1. 我们先考虑普通情况,如果遇到“-”,那么就可以判断进行以下操作

    • 从第一个字母的ASCLL码循环到第二个字母ASCLL码,将这一些字符存在一个string中,这里我们命名为tt
    • 判断参数:p1p_1 如果p1==1p_1==1那么将其全改成小写。如果是22,那么就只要将其全改成大写。如果是33,只要循环一遍tt,将其全改成*
    • 如果不是合法的,tt设为-
  2. 再判断特殊情况:

    • -连续重复出现时,直接跳过
    • -出现在开头或结尾时,不管他。
    • -的左边和右边的数不是一类的,(如左边是“1”,右边是“A”。或左右大小写不相同)直接跳过。
  3. 我们最好是最后输出,本次的示例代码是边加载边输出。

代码

#include<bits/stdc++.h>
using namespace std;
bool sud1(char a,char b,char c){
	bool a1,b2;
	if('A'<=a&&a<='Z'){
		a1=1;
	}
	if('A'<=b&&b<='Z'){
		b2=1;
	}
	if((a=='-'&&b=='-')||(c=='-'&&b=='-')||(c=='-'&&a=='-')){
		return true;
	}
	if(isdigit(a)!=isdigit(b)){
		return true;
	}
	if(a1!=b2){
		return true;
	}else{
		return false;
	}
	
}
int main(){
	freopen("zfc.in","r",stdin);
	freopen("zfc.out","w",stdout);
	int p1,p2,p3;
	cin>>p1>>p2>>p3;
	string a;
	cin>>a;
	for(int i=0;i<a.size();i++){
		string as;
		if(a[i]=='-'&&i!=0&&i!=a.size()-1){
			for(int p=a[i-1]+1;p<a[i+1];p++){
				for(int j=1;j<=p2;j++){
					as=as+(char)(p);
				}
			}
			if(p1==1){
				for(int p=0;p<as.size();p++){
					if('A'<=as[p]&&as[p]<='Z'){
						as[p]+=32;
					}
				}
			}
			if(p1==2){
				for(int p=0;p<as.size();p++){
					if('a'<=as[p]&&as[p]<='z'){
						as[p]-=32;
					}
				}
			}
			if(p1==3){
				for(int p=0;p<as.size();p++){
					as[p]='*';
				}
			}
			if(p3==2){
				for(int p=0;p<as.size()/2;p++){
					char u;
					u=as[p];
					as[p]=as[as.size()-1-p];
					as[as.size()-1-p]=u;
				}
			}
			if(a[i-1]>=a[i+1]||sud1(a[i-1],a[i+1],a[i])){
				as="-";
			}
			cout<<as;
		}else{
			cout<<a[i];
		}
	}
	return 0;
}

反思

没有将特殊情况列在纸上逐一排查,也没有打草稿。

还有,之后要将每一个部分用函数来“分装”不明显,不好滴BUG,将一些部分写函数中,如果有问题只检查那个函数就好了

4.机器

思路

按照上面约定,直接模拟。

具体思路
  1. 数组定义:

    • doreidore_i数组表示到制作第ii个零件了。
    • steepisteep_i数组表示第ii个零件目前到第几道工序了。
    • a[i][j].ida[i][j].id表示第ii个零件的第jj个工序要用什么机子做。
    • a[i][j].tma[i][j].tm表示第ii个零件的第jj个工序的时间。
    • lastilast_i表示第i个零件的上一次出现在哪。
    • tim[i][j]tim[i][j]表示第ii个零件的第jj个时刻,0表示还没用,1表示已经用了。
  2. 输入:

    • 将顺序存在doredore数组中。
    • 将前nn行(详情见题目)存在a.ida.id中。
    • 将其他的存在a.tma.tm中。
  3. 模拟(做题核心)

    • 命名:为了方便使用,简单易懂,我们将数组中的必要元素存到变量中:

      1. now=doreinow=dore_i,表示制作到nownow的零件了
      2. k=++steep[now]k=++steep[now]求当前制作到哪个工序了(由于steepsteep数组初始值为0,所以用++steep[now]++steep[now]
      3. x=a[now][k].idx=a[now][k].id,表示要用哪个机子。
      4. tm=a[now][k].tmtm=a[now][k].tm,表示加工这个零件的时间。
      5. op=last[now]op=last[now],表示这个零件上一道工序在哪个时间节点结束。因为必须做完上一道工序才可以做下一道。
      6. s=0s=0,记录点前时间节点(用来判断这个位置是否可以存下)
    • 下面正式开始解题

    • 将时间枚举一遍,如果这个时间还没用过,那么s++s++,因为可以将这个存在这。如果不行的话s=0s=0因为前面的都不能存下来。

    • 如果可以存下(满足条件),就将一路上的时间设为1

    • 将那个时间节点和目前的ansansmaxmax值,其中ansans是结果

  4. 输出ansans

代码

#include<bits/stdc++.h>
using namespace std;
struct P{
	int id,tm;
};
int ord[410];
int steep[30];
int tim[30][7010];
int last[410];
P a[30][30];
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>>ord[i];
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j].id;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j].tm;
		}
	}
	//开始模拟
	int ans=0;
	for(int i=1;i<=n*m;i++){
		int now=ord[i];
		int k=++steep[now];
		int x=a[now][k].id;
		int tm=a[now][k].tm;
		int op=last[now];
		int s=0;
		for(int j=op+1;;j++){
			if(tim[x][j]==0){
				s++;
			}else{
				s=0;
			}
			if(s==tm){
				for(int q=j-s+1;q<=j;q++){
					tim[x][q]=1;
				}	
				last[now]=j;
				ans=max(ans,j);
				break;
			}
		}
	}
	cout<<ans;
	return 0;
}

反思

没有做题经验,明明有思路却做不出来。

我知道了如果做题错了还要检查=是否写成==