2020年冬季PAT甲级

代码懒得修了,写的特别烂

1

题目

思路

直接求就好了。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll f[120]={0,1};
ll n,dif=1e9,ans=1;
int main(){
	cin>>n;
	for(int i=2;i<=60;i++){
		f[i]=f[i-1]+f[i-2];
		//cout<<f[i]<<endl;
	}
	for(int i=1;i<=60;i++){
		if(abs(n-f[i])<dif){
			ans=f[i];
			dif=abs(n-f[i]);
		}
	}
	cout<<ans<<endl;
	return 0;
}

2

题目

思路

直接匹配可能超时,从子序列串第一个字母在母串出现的位置开始匹配。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
string s,q;
vector<int>st;
string ans;
int len=1e9;
int main(){
	cin>>s>>q;
	if(q.size()==1){
		cout<<q<<endl;
		return 0;
	}
	for(int i=0;i<s.size();i++){
		if(s[i]==q[0]){
			st.push_back(i);
		}
	}
	for(int i=0;i<st.size();i++){
		int l=st[i],p=1;
		
		for(int j=l+1;j<s.size();j++){
			if(s[j]==q[p]){
				p++;
			}
			if(p==q.size()){
				int t=j-l+1;
				if(t<len){
					len=t;
					ans=s.substr(l,t);
				}
				break;
			}
		}
	}
	if(len!=1e9) cout<<ans<<endl;
	else{
		cout<<endl;
	}
	return 0;
}

3

题目

思路

直接建树求。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,m;
string s;
int lasdep[1020];
struct E{
	string s;
	int f;
}e[1020];
map<string,int>mp;
void dfs(int d){
	if(e[d].f!=-1){
		dfs(e[d].f);
	}
	if(e[d].f!=-1){
		cout<<"->";
	}
	cout<<e[d].s;
	
}
int main(){
	cin>>n;
	getline(cin,s);
	for(int i=1;i<=n;i++){
		getline(cin,s);
		int l=0;
		for(l=0;l<s.size();l++){
			if(s[l]!=' ') break;
		}
		string cur=s.substr(l);
		mp[cur]=i;
		e[i].s=cur;
		lasdep[l]=i;
		if(l==0){
			e[i].f=-1;
			continue;	
		}
		e[i].f=lasdep[l-1];
	}
	cin>>m;
	string q;
	for(int i=1;i<=m;i++){
		cin>>q;
		if(!mp[q]){
			cout<<"Error: "<<q<<" is not found."<<endl;
		}
		else{
			dfs(mp[q]);
			cout<<endl;
		}
	}
	return 0;
}

4

题目

思路

dfs枚举制造m个所有的情况,然后排序。

一开始读错题,然后猜了一下题意。

==重载写错,改了就过了。

如果是更难的题意,extend应该能骗点分。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define io_opt ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
int n,m,k;
void ot(int x){
	if(x>=10){
		cout<<x;
	}
	else{
		cout<<'0'<<x;
	}
}
int num(string x){
	int ret=0;
	if(x[0]=='+'){
		return -2;
	}
	else if(x[0]=='-'){
		return -1;
	}
	for(int i=0;i<x.size();i++){
		ret*=10;
		ret+=x[i]-'0';
	}
	return ret;
}
string s;
int c[120];
int w[120];
int pro[120];
struct E{
	vector<int>v;
	void print(){
		//sort(v.begin(),v.end());
		for(int i=0;i<v.size();i++){
			if(i!=0){
				cout<<" + ";
			}ot(v[i]);
		}
	}
	bool operator<(const E x)const{
		
		for(int i=0;i<min(v.size(),x.v.size());i++){
			if(v[i]==x.v[i]) continue;
			return v[i]<x.v[i];
		}
		return v.size()<x.v.size();
	}
	bool operator==(const E x)const{
		return v==x.v;
	}
};
vector<E>pth[120];
vector<vector<E>>ans;
vector<E>tmp;
map<int,int>mp;
bool check(int u,int i){
	E cur=pth[pro[u]][i];
	for(int i=0;i<cur.v.size();i++){
		if(mp[cur.v[i]]||w[cur.v[i]]==0) return false;
	}
	return true;
}
void mer(int u,int i){
	E cur=pth[pro[u]][i];
	for(int i=0;i<cur.v.size();i++){
		mp[cur.v[i]]++;
	}
}
void invmer(int u,int i){
	E cur=pth[pro[u]][i];
	for(int i=0;i<cur.v.size();i++){
		mp[cur.v[i]]--;
	}
}
void dfs(int u){
	//cout<<u<<":\n";
	if(u==m+1){
		ans.push_back(tmp);
		return;
	}
	for(int i=0;i<pth[pro[u]].size();i++){
		//cout<<u<<' '<<i<<endl;
		if(check(u,i)){
			tmp.push_back(pth[pro[u]][i]);
			mer(u,i);
			dfs(u+1);
			invmer(u,i);
			tmp.pop_back();
		}
	}
}
int cmp(vector<E> x,vector<E> y){
	for(int i=0;i<x.size();i++){
		if(x[i]==y[i]) continue;
		return x[i]<y[i];
	}	
}
void output(vector<E> x){
	for(int i=0;i<m;i++){
		x[i].print();
		cout<<" -> ";
		ot(pro[i+1]);
		cout<<endl;
	}
}
bool mg(E &x,E &y){
	int len=x.v.size();
	for(int i=0;i<y.v.size();i++){
		for(int j=0;j<len;j++){
			if(y.v[i]==x.v[j]) return false;
		}
		x.v.push_back(y.v[i]);
	}
	return true;
}
void extd(){
	for(int i=0;i<=99;i++){
		for(int j=0;j<pth[i].size();j++){
			for(int k=0;k<pth[i][j].v.size();k++){
				int add=pth[i][j].v[k];
				if(pth[add].size()==0) continue;
				for(int l=0;l<pth[add].size();l++){
					E nex=pth[i][j];
					int p=nex.v[k];
					nex.v.erase(nex.v.begin()+k);
					if(mg(nex,pth[add][l])){
						sort(nex.v.begin(),nex.v.end());
						pth[i].push_back(nex);
					}
				}
				
			}
		}
	}
}
int main(){
	//io_opt;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s;
		c[i]=num(s);
		w[c[i]]++;
	}
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>s;
		pro[i]=num(s);
	}
	cin>>k;
	for(int i=1;i<=k;i++){
		E cur;
		while(cin>>s){
			int t=num(s);
			if(t==-1) break;
			if(t==-2) continue;
			cur.v.push_back(t);
		}
		cin>>s;
		int t=num(s);
		pth[t].push_back(cur);
	}
	//extd();
	for(int i=0;i<=99;i++){
		E cur;
		cur.v.push_back(i);
		pth[i].push_back(cur);
	}
	dfs(1);
	sort(ans.begin(),ans.end(),cmp);
	//if(ans.size()>1) while(1);
	output(ans[0]);
	/*for(int i=0;i<ans.size();i++){
		output(ans[i]);
	}*/
	return 0;
}
posted @ 2020-12-05 19:49  CCWUCMCTS  阅读(231)  评论(0编辑  收藏  举报