A. 填涂颜色

题目类型:数学

思路

直接找规律即可,规律为min(n,k)×min(m,k)min(n,k)×min(m,k)

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	freopen("color.in","r",stdin);
	freopen("color.out","w",stdout);
	long long n,m,k;
	cin>>n>>m>>k;
	cout<<min(n,k)*min(m,k);
	return 0;
}

这道题考试的时候竟然没推出来规律,因为太紧张了啊啊啊啊。关键是我即使每次都放平了心情了,但是考试的时候还是会很紧张啊啊啊啊啊啊啊,该怎么办呀。

B. 密码

题目类型:字符串

思路

这道题可以打表我就是,也可以推规律,规律就是明文=密文-密钥+11,当然我觉得打表更方便。

代码

#include<bits/stdc++.h>
using namespace std;
char a[26][26]={
	'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
	'B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A',
	'C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B',
	'D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C',
	'E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D',
	'F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E',
	'G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F',
	'H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G',
	'I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H',
	'J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I',
	'K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J',
	'L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K',
	'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L',
	'N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M',
	'O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N',
	'P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
	'Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
	'R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q',
	'S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R',
	'T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S',
	'U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T',
	'V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U',
	'W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V', 
	'X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W',
	'Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X',
	'Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y',
};
int main(){
	freopen("vigenere.in","r",stdin);
	freopen("vigenere.out","w",stdout);
	string k,c;
	cin>>k>>c;
	int len=k.size();
	for(int i=0;i<c.size()-len;i++) k+=k[i];
	for(int i=0;i<c.size();i++) if(k[i]>='a'&&k[i]<='z') k[i]-=32;
	for(int i=0;i<c.size();i++){
		for(int j=0;j<26;j++){
			if(c[i]>='A'&&c[i]<='Z') if(a[k[i]-'A'][j]==c[i]) cout<<char(j+'A');
			if(c[i]>='a'&&c[i]<='z') if(a[k[i]-'A'][j]==c[i]-32) cout<<char(j+'a');
		}
	}
	return 0;
}

C. 海港

题目类型:数据结构

思路

我们可以用数据结构一个套一个,用一个滑动窗口来维护这个区间,若超过了8640086400秒,就将第一个元素的区间减一个国家的人数。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
vector<vector<int>> a;
int st[N],t[N],k[N],hh=1;
int main(){
	freopen("port.in","r",stdin);
	freopen("port.out","w",stdout);
	int n,cnt=0;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>t[i]>>k[i];
		vector<int> b;
		for(int j=1;j<=k[i];j++){
			int c;
	        cin>>c;
	        b.push_back(c);
	        if(st[c]==0) cnt++;
	        st[c]++;
		}
		a.push_back(b);
		while(t[i]-t[hh]>=86400){
			for(int j=0;j<a[hh-1].size();j++){
				st[a[hh-1][j]]--;
				if(st[a[hh-1][j]]==0) cnt--;
			}
			hh++;
		}
		cout<<cnt<<endl;
	}
	return 0;
}

这题不知道怎么查找之前的,所以就放弃了,下一次要想一想数据结构一个套一个的可能。

D. 流星雨

题目类型:搜索

思路

直接套模版即可,但是要有标记数组。别问我怎么知道的,问就是不加就RE了,我可是亲身试验。最后是钟柯哲哲的博客将我从RE的边缘救了回来,在此重磅推荐。

代码

#include<bits/stdc++.h>
using namespace std;
struct P{
	int x,y,step;
};
queue<P> q;
int m,mp[310][310];
bool vis[310][310];
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
int bfs(){
	q.push(P{0,0,0});
	while(q.size()){
		P now=q.front();
		q.pop();
		if(mp[now.x][now.y]==2e9) return now.step;
		for(int i=0;i<4;i++){
			int nx=now.x+dx[i],ny=now.y+dy[i];
			if(nx<0||nx>=302||ny<0||ny>=302||now.step+1>=mp[nx][ny]||vis[nx][ny]==1) continue;
			vis[nx][ny]=1;
			q.push(P{nx,ny,now.step+1});
		}
	}
	return -1;
}
int main(){
	freopen("meteor.in","r",stdin);
	freopen("meteor.out","w",stdout);
    cin>>m;
    for(int i=0;i<=301;i++) for(int j=0;j<=301;j++) mp[i][j]=2e9;
    for(int i=1;i<=m;i++){
    	int x,y,t;
    	cin>>x>>y>>t;
    	mp[x][y]=min(mp[x][y],t);
    	if(x!=0) mp[x-1][y]=min(mp[x-1][y],t);
    	if(y!=0) mp[x][y-1]=min(mp[x][y-1],t);
    	if(x<=300) mp[x+1][y]=min(mp[x+1][y],t);
    	if(y<=300) mp[x][y+1]=min(mp[x][y+1],t);
	}
	if(mp[0][0]==0) cout<<-1;
	else cout<<bfs();
	return 0;
}

没时间了,下次一定不能硬抗,可以做别的题。虽然我每次都这么说,但是这个毛病是一点没改,该怎么办呀!!