Codecraft-20 (Div.2)

最近狀態很差,A題居然WA了一發,然後B沒仔細觀察規律前綴是否翻轉和後綴的長度有關,C其實是會做的,但是不夠自信又糾結在B,以後要是卡題要快點跳,不能畏懼題目,面對困難要深呼吸,或者去洗把臉冷靜下再思考。
D題不難,但是我寫的程序總有一點bug,寫的又慢,我的程序實現能力需要鍛鍊,做題還要再冷靜一些,其實說實話div2 ABC三題都是思維爲主,應該要快速的A掉,後面就稍微有點算法實現能力的需要了,還要去總結一下stl,熟練掌握stl。

B. String Modification
思路:
找規律 暴力模擬
新遇到的stl:
make_pair(s,1)自動匹配類型更方便

string.substr(0,i-1); 複製[0,i-1)的子串

string.begin() string.end()

reverse(u.begin(),u.end());

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <set>

using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-10;
const int INF = 0x3f3f3f3f;
const ll mod  = 1e9 + 7;
const ll maxn = 1e6 + 5;

int main(){
	int T;
	cin>>T;
	while(T--){
		int n;
		string s;
		cin>>n>>s;
		pair<string, int>ans=make_pair(s,1);
		for(int i=2;i<=n;++i){
			string t=s.substr(i-1);
			string u=s.substr(0,i-1);
			if((n-(i-1))%2==1){//後綴的個數爲單數 前綴要翻轉
				reverse(u.begin(),u.end());
			}
			ans=min(make_pair(t+u,i),ans);
		}
		cout<<ans.first<<"\n"<<ans.second<<'\n';
	}
	return 0;
}

C. Primitive Primes
思路:
多項式展開得a、b數組第一個不被p整除的和的那一項必然不被p整除

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,p,a[1000005],b[1000005];
int main()
{
	scanf("%d%d%d",&n,&m,&p);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
		a[i]%=p;
	}
	for(int i=0;i<m;i++)
	{
		scanf("%d",&b[i]);
		b[i]%=p;
	}
	int x=0,y=0;
	while(a[x]==0)x++;
	while(b[y]==0)y++;
	printf("%d\n",x+y);
	return 0;
}

D. Nash Matrix
思路:
構造 染色 DFS
一開始我總是想着從一個非(-1,-1)的點去搜X的那個點,但是這樣是十分困難的,而且可能壓根連不到那個X,正難則反,我們應該從X入手去染色能到達且想到X的點。
至於(-1,-1)點的dfs可以正着染色,搜到最後無路可走的時候最後一步染色結果爲上一步,所以這裏要保存上一步相反的走法在char str中。
最後檢驗是否有非字母的點 如果有則INVALID否則VALID並輸出答案。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const double eps = 1e-10;
const int INF = 0x3f3f3f3f;
const ll mod  = 1e9 +7;
const ll MAXN = 1e6 + 5;
const int N = 1005;

int x[N][N];
int y[N][N];
char c[N][N];
bool vis[N][N];
int n;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
char ch1[5]="LRUD";
char ch2[5]="RLDU";

void dfs(int p,int q){
	for(int i=0;i<4;i++){
		int np=p+dx[i];
		int nq=q+dy[i];
		if(x[np][nq]==-1 || vis[np][nq] || np<1 || np>n || nq<1 || nq>n) continue;
		if(x[np][nq]!=x[p][q] || y[np][nq]!=y[p][q]) continue;
		vis[np][nq]=true;
		c[np][nq]=ch1[i];
		dfs(np,nq);
	}
}

void DFS(int p,int q,char str){
	bool flag=false;
	for(int i=0;i<4;i++){
		int np=p+dx[i];
		int nq=q+dy[i];
		if(x[np][nq]!=-1 || vis[np][nq] || np<1 || np>n || nq<1 || nq>n){
			if(!flag && i==3){
				c[p][q]=str;
			}
			continue;
		}
		flag=true;
		c[p][q]=ch2[i];
		vis[np][nq]=true;
		DFS(np,nq,ch1[i]);
	}
}


int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>x[i][j]>>y[i][j];
			if(x[i][j]==i && y[i][j]==j){c[i][j]='X',vis[i][j]=true;}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(c[i][j]=='X'){
				vis[i][j]=true;
				dfs(i,j);
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(x[i][j]==-1&&!vis[i][j]){
				DFS(i,j,'1');
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(!isalpha(c[i][j])){
				cout<<"INVALID\n";
				return 0;
			}
		}
	}
	cout<<"VALID\n";
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cout<<c[i][j];
		}
		cout<<"\n";
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章