发射站(模拟)

思路没想到的原因

思路方向没有对,本来想直接模拟的,结果没对。

思路

因为题目的数据范围很小,所以可以循环遍历正方形的中心坐标,求出能覆盖的点的总和。

还需注意越界问题。(别问我怎么知道的

代码

#include <bits/stdc++.h>
using namespace std;

const int tt=1010;
int a[tt][tt];
map<int,int> mp;

int main(){
	freopen("fsz.in","r",stdin);
	freopen("fsz.out","w",stdout);
	int d;
    int n;
    int max_n=0;
    int cnt=0;
    int ans=0;
    cin >>d>>n;
    for(int i=1;i<=n;i++){
		int x,y,k;
		cin >>x>>y>>k;
		a[x][y]=k;
    }
	ans=0;
	for(int i=0;i<=128;i++){
    	for(int j=0;j<=128;j++){
    		ans=0;
    		for(int k=max(i-d,0);k<=min(i+d,128);k++){
    			for(int t=max(j-d,0);t<=min(j+d,128);t++){
    				ans+=a[k][t];
				}
			}
			max_n=max(max_n,ans);
			mp[ans]++;
		}
	}
	cout <<mp[max_n]<<" "<<max_n;
	return 0;
}

翻译鸡(模拟)

思路

其实是小W的病毒歼灭战原题。 用一个队列来统计,遇到没有的入队,全满了就让第一个出队,并cnt++cnt++

代码

#include <bits/stdc++.h>
using namespace std;

const int N=1010;
int a[N],f[N];
queue<int> q;
int hh=0,tt=-1;

int main(){
	freopen("fyj.in","r",stdin);
	freopen("fyj.out","w",stdout);
    int m,n;
    cin >>m>>n;
    for(int i=0;i<n;i++){
        cin >>a[i];
        q.push(a[i]);
    }
    int cnt=0;
    for(int i=0;i<n;i++){
        int w=q.front();
        q.pop();
        bool flag=1;
        for(int j=hh;j<=tt;j++){
            if(f[j]==w) flag=0;
        }
        if(flag!=0){
            cnt++;
            if(tt-hh+1==m) hh++;
            f[++tt]=w;
        }
    }
    cout <<cnt;
    return 0;
}

字符串(模拟)

思路没想到的原因

没有判断一种情况,且思路和代码很乱。以后要打草稿,把代码的可读性增强

思路

判断是否是-,如果是,就判断上一个字符与下一个字符是否都是字母或都是数字,且上一个字符是否小于下一个字符。

如果条件都满足,那么我们就根据p1,p2,p3p1,p2,p3 的条件来输出。

如果条件不满足,输出-

当前字符若不是-,直接输出当前字符。

代码

#include <bits/stdc++.h>
using namespace std;

bool f(char z){
	return z>='a'&&z<='z';
}

char p(char z){
	if(z>='a'&&z<='z') return z-32;
	else return z;
}

int main(){
	freopen("zfc.in","r",stdin);
	freopen("zfc.out","w",stdout);
	int p1,p2,p3;
	bool flag=1;
	cin >>p1>>p2>>p3;
	string s;
	int cnt=0;
	cin >>s;
	for(int i=0;i<s.size();i++){
		if(s[i]!='-') cout <<s[i];
		else if(s[i]=='-'){
			if((isdigit(s[i-1])&&isdigit(s[i+1])&&s[i+1]>s[i-1])||(f(s[i-1])&&f(s[i+1])&&s[i+1]>s[i-1])){
				if(p3==1){
					for(char j=s[i-1]+1;j<=s[i+1]-1;j++){
						cnt=0;
						while(cnt!=p2){
							if(p1==1){
								cout <<char(j);
								cnt++;
							}else if(p1==2){
								cout <<char(p(j));
								cnt++; 
							}else{
								cout <<"*";
								cnt++;
							}
						}
					}
				}else{
					for(char j=s[i+1]-1;j>=s[i-1]+1;j--){
						cnt=0;
						while(cnt!=p2){
							if(p1==1){
								cout <<char(j);
								cnt++;
							}else if(p1==2){
								cout <<char(p(j));
								cnt++; 
							}else{
								cout <<"*";
								cnt++;
							}
						}
					}
				}
			}else{
				cout <<"-";
			}
		}
	}
	return 0;
}

机器(模拟)

思路没想到的原因

样例都没有看懂,以后注意时间的规划。

思路

直接模拟。把输入的存好,按照流水线来,创造两个时间轴,一个一个存入空白的地方。存完之后,标记,以防后面又遍历一次。

我们用step[i]step[i]来代表工件ii现在的工序,nownow用来将这个工件备份,tt用来代表这个工件的这个工序所用的时间。

代码

#include <bits/stdc++.h>
#define id first
#define tm second
using namespace std;

const int tt=510;
int a[tt][7000],ord[tt],step[tt],last[tt];
pair<int,int> tim[tt][tt];

int main(){
	freopen("jq.in","r",stdin);
	freopen("jq.out","w",stdout);
	int m,n;
    cin >>m>>n;
    for(int i=1;i<=n*m;i++){
        cin >>ord[i];
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin >>tim[i][j].id;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin >>tim[i][j].tm;
        }
    }
    int ans=0;
    for(int i=1;i<=n*m;i++){
    	int now=ord[i];
    	int k=++step[now];
    	int x=tim[now][k].id;
    	int t=tim[now][k].tm;
    	int s=0;
    	for(int j=last[now]+1;;j++){
    		if(a[x][j]==0) s++;
			else s=0;
			if(s>=t){
				for(int q=j-s+1;q<=j;q++){
					ans=max(ans,j);
					last[now]=j;
					a[x][q]=1;
				}
				break;
			} 
		}
	}
	cout <<ans;
	return 0;
}

谢谢