【PTA】团体程序设计天梯赛-练习集 L2题目总结(完)

模拟题

L2-002 链表去重(链表模拟)

L2-002 链表去重
用两个数组分别表示键值和下一个结点来模拟链表。注意可能存在无重复键值的绝对值的情况。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
const int N=1e5+10;
int n,head;
map<int,int>mp;
int a[N],ne[N];//某个地址的键值、下一个地址 
struct node
{
	int v,d;
};
vector<node>ans1,ans2;
int main()
{
	cin>>head>>n;
	fir(i,1,n)
	{
		int t;cin>>t;
		cin>>a[t]>>ne[t];
		//不能直接cin>>t>>a[t]>>ne[t]
		//因为不回车是输入不进t的(?) 
	}
	int p=head;	
	//关键
	while(p!=-1)
	{		
		if(mp[abs(a[p])]==0)
		{
			ans1.pb({a[p],p});
			mp[abs(a[p])]=1;
		}
		else
		{
			ans2.pb({a[p],p});
		}
		p=ne[p];
	}
	//后面都是输出,注意格式即可
	int t=0;
	printf("%05d %d",ans1[0].d,ans1[0].v);
	for(auto x:ans1)
	{
		if(t)
		{
			printf(" %05d\n",x.d);
			printf("%05d %d",x.d,x.v);
		}
		t++;
	}
	cout<<" "<<-1<<endl;
	if(ans2.size())
	{
		t=0;
		printf("%05d %d",ans2[0].d,ans2[0].v);
		for(auto x:ans2)
		{
			if(t)
			{
				printf(" %05d\n",x.d);
				printf("%05d %d",x.d,x.v);
			}
			t++;
		}
		cout<<" "<<-1<<endl;
	}
	return 0;
}

L2-008 最长对称子串(模拟+枚举)

L2-008 最长对称子串
枚举每一个中轴即可。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
const int N=1e5+10;
int n;
string a;
int main()
{
	getline(cin,a);
	int ans=1;
	for(int i=0;a[i];i++)
	{
		//a[i]是中轴 
		int t=1;
		int j1=i-1,j2=i+1;
		while(j1>=0&&j2<a.size()&&a[j1]==a[j2])
		{
			j1--;j2++;
			t+=2;
		}
		ans=max(ans,t);
		
		//无中轴
		t=0;
		j1=i,j2=i+1;
		while(j1>=0&&j2<a.size()&&a[j1]==a[j2])
		{
			j1--;j2++;
			t+=2;
		 } 
		 ans=max(ans,t);
	}
	cout<<ans;
	return 0;
}

L2-018 多项式A除以B(模拟+注意范围)

L2-018 多项式A除以B

常规样例:18分。
第一个0 0 0.0 3分,第二个0 0 0.0 3分,两个都是0 0 0.0 1分,共25分。
要四舍五入后不是0,则范围在:大于等于0.05(四舍五入0.1),或小于等于-0.05(四舍五入-0.1)。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
const int N=1e5+10;
int n,m,m1,m2;
double a[N],b[N],c[N];//a[i]表示该指数对应的系数 
int main()
{
	cin>>n;
	//指数 系数
	fir(i,1,n)
	{
		int x,y;cin>>x>>y;
		m1=max(x,m1);
		a[x]=y;
	} 
	cin>>m;
	fir(i,1,m)
	{
		int x,y;cin>>x>>y;
		m2=max(x,m2);
		b[x]=y;
	} 
	
	int t1=m1,t2=m2;
	
	//核心 
	while(t1>=t2)
	{
		double tt=a[t1]/b[t2];
		c[t1-t2]=tt;
		for(int i=t1,j=t2;j>=0;j--,i--) a[i]-=b[j]*tt;//核心中核心 
		while(abs(a[t1])<0.000001) t1--;//如果系数是0就不参加运算——否则会TLE 
	}
	
	int f=0,sum1=0;
	for(int i=0;i<=m1;i++)
	{				
		if(c[i]>=0.05||c[i]<=-0.05) //找最大的系数 
		{
			f=i;
			sum1++;
		}
	} 
	
	if(sum1)
	{
		cout<<sum1;
		for(int i=f;i>=0;i--)
		{			
			if(c[i]>=0.05||c[i]<=-0.05) printf(" %d %.1f",i,c[i]);
		}
	}
	else printf("0 0 0.0");
	
	int ff=0,sum2=0;
	for(int i=0;i<=m2;i++)
	{		
		if(a[i]>=0.05||a[i]<=-0.05) //找最大的系数 
		{
			ff=i;
			sum2++;
		}
	} 
	cout<<endl;
	
	if(sum2)
	{
		cout<<sum2;
		for(int i=ff;i>=0;i--)
		{			
			if(a[i]>=0.05||a[i]<=-0.05) printf(" %d %.1f",i,a[i]);
		}
	}
	else printf("0 0 0.0");
	return 0;
}

L2-020 功夫传人(模拟+bfs)

L2-020 功夫传人

从根结点开始bfs即可。根的武功值是z,编号是0;

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
const int N=1e5+10;
int n;double z,r;
vector<int>g[N];
int d[N];//得道 
double a[N];
double anss;
struct node
{
	double v;
	int u;
};
void bfs()
{
	queue<node>q;
	q.push({z,0});
	while(q.size())
	{
		node temp=q.front();
		q.pop();
		
		if(g[temp.u].size())
		{
			for(auto x:g[temp.u])
			{
				node t={temp.v*r,x};
				a[x]=temp.v*r;
				q.push(t);
			}
		}
		else
		{
			anss+=temp.v*d[temp.u];
		}		
	}
}
int main()
{
	cin>>n>>z>>r;
	r=100-r;
	r*=0.01;
	
	fir(i,0,n-1)
	{
		int k;cin>>k;
		if(!k)
		{
			cin>>d[i];
		}
		while(k--)
		{
			int t;cin>>t;
			g[i].pb(t);
		}
	}
	
	a[0]=z;
	bfs();	

	cout<<(int)anss;
	return 0;
}

L2-022 重排链表(模拟+分类)

L2-022 重排链表

在ij循环的时候,分别注意:i=j、n是偶数、n是奇数的情况。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
const int N=1e5+10;
int n,head;
int v[N],ne[N];
struct node
{
	int now,v,ne;
};
vector<node>a,ans;
int main()
{
	cin>>head>>n;
	fir(i,1,n)
	{
		int t;cin>>t;
		cin>>v[t]>>ne[t];
	}
	int p=head;
	while(p!=-1)
	{
		node temp={p,v[p]};
		a.pb(temp);
		p=ne[p];
	}
	int i=0,j=a.size()-1;
	while(1)//这里不能是i!=j 否则若只有一个就无法输出 
	{
		ans.pb(a[j]);	
		if(j==i) break;//奇数	
		ans.pb(a[i]);
		j--;
		if(j==i) break;//偶数 
		i++;
	}
	for(int i=0;i<ans.size();i++)
	{
		if(i!=ans.size()-1) ans[i].ne=ans[i+1].now;
		else ans[i].ne=-1;
	}
	for(auto x:ans)
	{
		if(x.ne!=-1) printf("%05d %d %05d\n",x.now,x.v,x.ne);
		else printf("%05d %d -1\n",x.now,x.v);
	}
	return 0;
}

L2-028 秀恩爱分得快(模拟+细心)

L2-028 秀恩爱分得快

纯纯模拟,但是有点坑。

  • 要string输入,因为可能输入-0表示女性。
  • 要先把所有的值存起来,输入两个数字后再判断是否要计算,不然会TLE。
  • 输出要按顺序,但其实不用排序,从小到大遍历,满足条件的输出即可。
#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
#define pb push_back
typedef long long ll;
const int N=1e3+10;
int n,m;
double a[N][N];
vector<int>g[N];
int ge[N];
int toint(string a)
{
	int ans=0;
	for(int i=0;a[i];i++)
	{
		if(a[i]>='0'&&a[i]<='9') ans=ans*10+a[i]-'0';
	}
	return ans;
}
int main()
{
	cin>>n>>m;
	fir(i,1,m)
	{
		int t;cin>>t;
		while(t--)
		{
			string tt;cin>>tt;
			int ttt=toint(tt);
			if(tt[0]=='-') ge[ttt]=-1;
			else ge[ttt]=1;
			g[i].pb(ttt);
		}
	}
	string x,y;cin>>x>>y;
	int f1=0,f2=0;
	int xx=toint(x),yy=toint(y);
	if(x[0]=='-') f1=-1,f2=1;
	else f1=1,f2=-1;
	
	fir(i,1,m)
	{
		int f=0;
		for(auto u:g[i])
		{
			if(u==xx||u==yy) f=1;
		}
		vector<int>bo,gi;
		if(f)//有 
		{
			for(auto u:g[i])
			{
				if(ge[u]==1) bo.pb(u);
				else gi.pb(u);
			}
			for(auto u:bo)
				for(auto v:gi)
				{
					a[u][v]+=1.0/g[i].size();
					a[v][u]+=1.0/g[i].size();
				}						
		}
	}
		
	double max1=-1,max2=-1;
	fir(i,0,n-1)
		max1=max(max1,a[xx][i]);
	fir(i,0,n-1)
		max2=max(max2,a[yy][i]);
	
	if(max1==a[xx][yy]&&max2==a[yy][xx])
	{
		cout<<x<<" "<<y;return 0;
	}
	
	fir(i,0,n-1)
	{
		if(a[xx][i]==max1)
		{
			cout<<x<<" ";
			if(f1==1) cout<<"-";
			cout<<i<<endl;
		}
	}
	fir(i,0,n-1)
	{
		if(a[yy][i]==max2)
		{
			cout<<y<<" ";
			if(f2==1) cout<<"-";
			cout<<i<<endl;
		}
	}
	return 0;
}

L2-029 特立独行的幸福(模拟+map+素数)

L2-029 特立独行的幸福

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
#define pb push_back
typedef long long ll;
const int N=1e4+10;
int v[N];int l,r;
map<int,int>mp,d;
void solve(int x)
{
	memset(v,0,sizeof(v));
	int xx=x;
	while(x!=1)
	{
		int y=0;
		while(x)
		{
			y+=((x%10)*(x%10));
			x/=10;
		}
		x=y;
		v[x]++;		
		if(v[x]==2) return;//死循环 
	}	
	x=xx;
	int t=0;
	while(x!=1)
	{
		mp[x]++;
		int y=0;
		while(x)
		{
			y+=((x%10)*(x%10));
			x/=10;
		}
		x=y;		
		t++;
	}
	d[xx]=t;
}
int isp(int x)
{
	for(int i=2;i<=sqrt(x);i++)
	{
		if(x%i==0) return 0;
	}
	return 1;
}
int main()
{
	cin>>l>>r;
	int ans=0;
	for(int i=l;i<=r;i++)
	{
		solve(i);
	}
	
	for(int i=l;i<=r;i++)
	{
		if(mp[i]==1)
		{
			cout<<i<<" ";
			int t=d[i];
			if(isp(i)) t*=2;
			cout<<t<<endl;
			ans++;
		}
	}
	if(!ans) cout<<"SAD";
	return 0;
}

L2-030 冰岛人(模拟+map+pair)

L2-030 冰岛人

注意:

所谓“五代以内无公共祖先”是指两人的公共祖先(如果存在的话)必须比任何一方的曾祖父辈分高。

那么想要有公共祖先,就是上述命题取反:两人公共祖先比任何一方曾祖父辈分低 即可,不用把任何一方改成所有!

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
const int N=1e5+10;
int n,m;
/*
孩子姓=父亲名+后缀
不同名,则名字是唯一标志 
*/
map<string,pair<string,int>>mp;//名 姓 性别 1男-1女 
int solve(string m1,string m2)
{
	int i=1;
	
	for(string a=m1;a!="";a=mp[a].first)//自己的姓是父亲的名
	{
		int j=1;
		for(string b=m2;b!="";b=mp[b].first)
		{
			/*
			比任何一方的曾祖父高算没有公共祖先
			那么比 任何一方 的曾祖父低 算有公共祖先 
			*/ 
			if((i<5||j<5)&&a==b) return 0;
			if(i>=5&&j>=5) break;
			j++;
		}
		i++;
	} 
	return 1;
}
int main()
{
	cin>>n;
	//名 姓 
	fir(i,1,n)
	{
		string a,b;cin>>a>>b;
		//不是维京人 则姓氏没有意义 
		if(b[b.size()-1]=='m'||b[b.size()-1]=='f')
		{
			int f=0;
			if(b[b.size()-1]=='m') f=1;
			else f=-1;			
			mp[a]={"",f}; 
		}
		else
		{
			if(b[b.size()-1]=='n')//sson 男
			{
				mp[a]={b.substr(0,b.size()-4),1}; 
			} 
			else
			{
			 	mp[a]={b.substr(0,b.size()-7),-1}; 
			}
		}
	}
	
	cin>>m;
	while(m--)
	{
		string m1,x1,m2,x2;cin>>m1>>x1>>m2>>x2;
		if(mp.find(m1)==mp.end()||mp.find(m2)==mp.end()) puts("NA");
		else if(mp[m1].second==mp[m2].second) puts("Whatever");
		else
		{
			int ans=solve(m1,m2);
			if(ans) puts("Yes");
			else puts("No");
		}
	}
	return 0;
}

L2-032 彩虹瓶(模拟+stack)

L2-032 彩虹瓶

每次now改变的时候都要判断栈顶是否可以弹出即可。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
#define pb push_back
typedef long long ll;
const int N=1e5+10;
int n,m,k;
int main()
{
	cin>>n>>m>>k;
	while(k--)
	{
		int now=1,f=0;
		stack<int>s;
		fir(i,1,n)
		{
			int t;cin>>t;
			if(t==now)
			{
				now++;
				while(s.size()&&s.top()==now)
				{
					now++;s.pop();
				}
			}
			else
			{
				if(s.size()+1<=m) s.push(t);
				else f=1;
			}
		}
		while(s.size()&&s.top()==now)
		{
			s.pop();now++;
		}
		if(f||now!=n+1) puts("NO");
		else puts("YES");
		
	}
	return 0;
}

L2-033 简单计算器(stack)

L2-033 简单计算器
模拟即可。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
#define pb push_back
typedef long long ll;
const int N=1e3+10;
//n2 op n1
int n;
stack<int>s,op;
int cal(int x,int y,char op)
{
	if(op=='+') return x+y;
	else if(op=='*') return x*y;
	else if(op=='-') return y-x;
	else if(op=='/')
	{
		if(x) return y/x;
		else return 0x3f3f3f3f;
	}
}
int main()
{
	cin>>n;
	fir(i,1,n)
	{
		int t;cin>>t;s.push(t);
	}
	fir(i,2,n)
	{
		char t;cin>>t;op.push(t);
	}
	while(s.size()&&op.size())
	{
		if(op.empty()) break;
		int n1,n2;char ch;
		n1=s.top();s.pop();
		n2=s.top();s.pop();
		ch=op.top();op.pop();
		
		int now=cal(n1,n2,ch);
		if(now==0x3f3f3f3f)
		{
			printf("ERROR: %d/%d",n2,n1);
			return 0;
		}
		else s.push(now);
		//cout<<now<<endl;
	}
	
	cout<<s.top();
	return 0;
}

L2-034 口罩发放(大模拟+处处是细节)

L2-034 口罩发放

注意:不要用简单的mp[a]==0来表示a没有出现过,要用mp.find(a)==mp.end()来表示。
细节:

  • 身份证号 必须是 18 位的数字:18位且全都是数字。
  • 如果提交时间相同,则按照在列表中出现的先后顺序决定:按照输入顺序要有一个优先级。
  • 记录上一次拿口罩的日期。
  • 身体状况是1的不能重复输出。
#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
#define pb push_back
typedef long long ll;
const int N=1e5+10;
struct node
{
	string name,id;int h,hh,mm,pr;
};
vector<node>v;
bool cmp(node a,node b)
{
	if(a.hh!=b.hh) return a.hh<b.hh;
	else if(a.mm!=b.mm) return a.mm<b.mm;
	else return a.pr<b.pr;
}
int d,p,t,s;
map<string,int>mp;//存上一次发口罩 
int check(string a)//检查是否全是数字 
{
	for(int i=0;a[i];i++)
	{
		if(a[i]>='0'&&a[i]<='9') continue;
		else return 0;
	}
	return 1;
}
int main()
{
	cin>>d>>p;
	fir(i,1,d)
	{
		cin>>t>>s;
		vector<node>vv;
		fir(j,1,t)
		{
			node temp;
			cin>>temp.name>>temp.id>>temp.h>>temp.hh;
			char op;cin>>op>>temp.mm;
			if(!check(temp.id)) continue;
			if(temp.id.size()!=18) continue;
			temp.pr=j;
			
			if(temp.h) v.pb(temp);	
			vv.pb(temp);			
		}
		sort(vv.begin(),vv.end(),cmp);
		
		for(auto x:vv)
		{			
			if(s)
			{
				int flag=0;
				if(mp.find(x.id)==mp.end())
				{
					flag=1;
					mp[x.id]=i;
				}
				else
				{
					if(i-mp[x.id]>=p+1)
					{
						flag=1;mp[x.id]=i;
					}
				}
				if(flag) 
				{
					cout<<x.name<<" "<<x.id<<endl;s--;
				}
			}
			else break;
		}
	}
	map<string,int>d;
	for(auto x:v)
	{
		if(d.find(x.id)==d.end()) 
		{
			d[x.id]=1;
			cout<<x.name<<" "<<x.id<<endl;
		}
	}
	return 0;
}

L2-037 包装机(模拟+分类)

L2-037 包装机

注意:stack满了但是queue为空——不操作。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
#define pb push_back
typedef long long ll;
const int N=1e2+10;
int n,m,sm;
queue<char>q[N];
stack<char>s;
int main()
{
	cin>>n>>m>>sm;
	fir(i,1,n)
		fir(j,1,m)
		{
			char ch;cin>>ch;
			q[i].push(ch);
		}
	
	int t;
	while(cin>>t)
	{
		if(t==-1) break;
		if(!t)
		{
			if(s.size()) //有东西放才放 
			{
				cout<<s.top();
				s.pop();
			}
		}
		else
		{
			if(s.size()==sm&&q[t].size())//满了 但是有东西放才行动 
			{
				cout<<s.top();
				s.pop();
			}
			if(q[t].size()) //有东西放才放 
			{
				s.push(q[t].front());
				q[t].pop();
			}
		}
	}
	return 0;
}

L2-040 哲哲打游戏

L2-040 哲哲打游戏

纯模拟,但我去年比赛没做出来。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
#define pb push_back
typedef long long ll;
const int N=1e5+10;
int n,m;
vector<int>g[N];
int a[105];//存档 
int main()
{
	cin>>n>>m;
	fir(i,1,n)
	{
		int t;cin>>t;
		while(t--)
		{
			int x;cin>>x;g[i].pb(x);
		}
	}
	int now=1;
	while(m--)
	{
		int x,y;cin>>x>>y;
		if(x==0)//选 
		{
			y--;
			now=g[now][y];
		}
		else if(x==1)//存 
		{
			a[y]=now;
			cout<<now<<endl;
		}
		else//读 
		{
			now=a[y];
		}
	}
	cout<<now;
	return 0;
}

简单模拟,不贴代码

  • L2-009 抢红包
  • L2-015 互评成绩
  • L2-017 人以群分
  • L2-019 悄悄关注
  • L2-021 点赞狂魔
  • L2-027 名人堂与代金券
  • L2-036 网红点打卡攻略

STL题

L2-005 集合相似度(set)

L2-005 集合相似度
由标题都知道要用集合做。如果不用set会很容易TLE,且十分复杂。

题意:交集/并集。
输入会重复,所以要先去重(set)。
求交集,并集的函数:(两个数组必须是升序的,set正好满足)

求交集:
auto it=set_intersection(a.begin(),a.end(),b.begin(),b.end(),v.begin());
返回vector的迭代器,求的是从a.begin(),a.end()这个集合 到 b.begin(),b.end()这个集合的交集,放到从v.begin()开始的vector中。
则it-v.begin()的值就是个数。

求并集:
auto it=set_union(a.begin(),a.end(),b.begin(),b.end(),v.begin());
同理

题外话:求集合A-B(在A不在B中的)

auto it=set_difference(a.begin(),a.end(),b.begin(),b.end(),v.begin());

代码:如果不知道这个函数真的很难拿满分

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
const int N=50+10;
int n;
vector<int>a[N];
int main()
{
	cin>>n;
	fir(i,1,n)
	{
		int t;cin>>t;
		set<int>s;//要去重 因为问的是元素的个数 
		while(t--)
		{
			int x;cin>>x;
			s.insert(x);
		}
		for(auto x:s)
		{
			a[i].pb(x);
		}
	}
	int m;cin>>m;
	while(m--)
	{
		int x,y;cin>>x>>y;
		//Nc是两个集合的交集,Nt是两个集合的并集
		//set_intersection 交集 set_union 并集 
		vector<int>v(10005);
		auto it=set_intersection(a[x].begin(),a[x].end(),a[y].begin(),a[y].end(),v.begin());
		int ans1=it-v.begin();
		it=set_union(a[x].begin(),a[x].end(),a[y].begin(),a[y].end(),v.begin());
		int ans2=it-v.begin();		
		printf("%.2f%\n",ans1*100.0/ans2);
	}
	return 0;
}

L2-014 列车调度(巧妙地用set)

L2-014 列车调度
用一条队中最小的元素来代表这条队伍。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
#define pb push_back
typedef long long ll;
const int N=1e5+10;
set<int>s;
/*
相当于用一个元素来代表这一条队伍
该元素是这条队伍的最小值 
*/ 
int main()
{
	int n;cin>>n;
	s.insert(0);
	while(n--)
	{
		int t;cin>>t;
		if(t<*s.rbegin())//t比s中最大的值小 
		{
			s.erase(*s.upper_bound(t));
			//找到大于t的第一个元素的迭代器 删除这个值	相当于排在这个值后面 取代了这条队伍的最小值		
		}
		s.insert(t); 
	}
	cout<<s.size()-1;
	return 0;
}

L2-039 清点代码库(vector和multimap)

L2-039 清点代码库
参考柳神的代码

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
#define pb push_back
typedef long long ll;
const int N=1e4+10;
int n,m;
map<vector<int>,int>mp;
multimap<int,vector<int>,greater<int>>s;
int main()
{
	cin>>m>>n;
	fir(i,1,m)
	{
		vector<int>t;
		fir(j,1,n)
		{
			int tt;cin>>tt;t.pb(tt);
		}
		mp[t]++;
	}
	for(auto x:mp) s.insert({x.second,x.first});
	
	cout<<mp.size()<<endl;
	for(auto x:s)
	{
		cout<<x.first;
		for(auto y:x.second)
		{
			cout<<" "<<y;
		}
		cout<<endl;
	}
	return 0;
}

算法题

L2-016 愿天下有情人都是失散多年的兄妹(搜索)

L2-016 愿天下有情人都是失散多年的兄妹

搜到第五层,bfs、dfs均可。
注意:父母的性别也要记录

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
const int N=1e5+10;
int n;
int gender[N];//1男0女 
struct node
{
	int f,m;
}a[N];
struct nodee
{
	int u,ans;
};
void ini()
{
	for(int i=0;i<1e5;i++) gender[i]=-1;
}
int v[N];
map<int,int>mp;
void bfs(int t)
{
	queue<nodee>q;
	q.push({t,1});
	mp[t]++;
	while(q.size())
	{		
		nodee temp=q.front();
		q.pop();
		
		if(temp.ans==5) continue;
		nodee t1={a[temp.u].f,temp.ans+1};
		nodee t2={a[temp.u].m,temp.ans+1};
		
		if(a[temp.u].f!=-1)
		{
			mp[a[temp.u].f]++;
			q.push(t1);
		}
		if(a[temp.u].m!=-1)
		{
			mp[a[temp.u].m]++;
			q.push(t2);
		}
	}
}
int main()
{
	ini();
	cin>>n;
	fir(i,1,n)
	{
		int t;cin>>t;
		char ch;cin>>ch;
		if(ch=='M') gender[t]=1;
		else gender[t]=0;
		
		int f,m;cin>>f>>m;
		if(f!=-1) gender[f]=1;
		if(m!=-1) gender[m]=0;
		
		a[t]={f,m};
	}
	int m;cin>>m;
	while(m--)
	{
		int x,y;cin>>x>>y;
		if(gender[x]==gender[y]) puts("Never Mind");
		else
		{
			memset(v,0,sizeof(v));
			mp.clear();
			bfs(x);
			bfs(y);
			
			int f=0;
			for(auto xx:mp)
			{
				if(xx.second==2)
				{
					f=1;break;
				}
			}
			
			if(f) puts("No");
			else puts("Yes");
		}
	}
	return 0;
}

简单算法,不贴代码

  • L2-003 月饼(贪心+double即可)

图论题

L2-001 紧急救援(dijsktra+dfs)

L2-001 紧急救援

思路:
想知道最短路有几条,要先求出最短路长度(dij),然后用dfs判断:若dist[j]=dist[i]+g[i]j[j],则这条路也在最短路上,可以继续往下搜。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
const int N=500+10;
int n,m,s,d;
int g[N][N];
int val[N];//救援队 
int dist[N];//到起点的最短路
int st[N];//起点到这个点的最短路是否已经确定 
int ans,maxn;//maxn->jiu 
vector<int>anss,temp;//救援队答案 
void dij()
{
	memset(dist,0x3f,sizeof(dist));
	dist[s]=0;
	for(int i=0;i<=n-1;i++)
	{
		int t=-1;
		for(int j=0;j<=n-1;j++)
		{
			if(!st[j]&&(t==-1||dist[j]<dist[t]))
			{
				t=j;
			}
		}
		
		st[t]=1;
		for(int j=0;j<=n-1;j++)
		{
			dist[j]=min(dist[t]+g[t][j],dist[j]);
		}
	}
} 
int v[N];
int num=0;
void dfs(int u,int jiu)
{
	if(u==d)
	{
		if(jiu>maxn)
		{
			maxn=jiu;
			anss=temp;			
		}
		num++;
		return;
	}
	v[u]=1;
	for(int i=0;i<=n-1;i++)
	{
		if(!v[i]&&dist[i]==dist[u]+g[u][i])
		{
			v[i]=1;
			temp.pb(i);
			dfs(i,jiu+val[i]);
			v[i]=0;
			temp.pop_back();
		}
	}
}
int main()
{
	cin>>n>>m>>s>>d;
	fir(i,0,n-1) cin>>val[i];
	memset(g,0x3f,sizeof(g));
	fir(i,1,m)
	{
		int a,b,c;cin>>a>>b>>c;
		g[a][b]=g[b][a]=c;
	} 
	
	dij();
	ans=dist[d];//最短路长度是ans
	
	temp.pb(s);
	dfs(0,val[s]);
	
	cout<<num<<" "<<maxn<<endl;
	int f=0;
	for(auto x:anss)
	{
		if(f) cout<<" ";
		f++;
		cout<<x;
	}
	return 0;
}

L2-013 红色警报(dfs+连通度)

L2-013 红色警报

注意:每一次攻陷了的城要在图上存起来,而不是存在一个t里,dfs的时候遇到它就跳过——这次被攻陷了,下次也是被攻陷的。所以要用矩阵存。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
const int N=500+10;
int n,m,k;
int g[N][N];
int now,ans;
int v[N];
void dfs(int u)
{
	v[u]=1;
	for(int i=0;i<n;i++)
	{
		if(!v[i]&&g[u][i])
		{
			v[i]=1;
			dfs(i);
		}
	}
}
int judge()
{
	int anss=0;
	memset(v,0,sizeof(v));
	for(int i=0;i<n;i++)
	{
		if(!v[i])
		{
			anss++;
			dfs(i);
		}
	}
	return anss;
}
int main()
{
	cin>>n>>m;
	fir(i,1,m)
	{
		int a,b;cin>>a>>b;
		g[a][b]=1;
		g[b][a]=1;
	}
	now=judge();
	
	cin>>k;
	fir(i,1,k)
	{
		int t;cin>>t;
		for(int j=0;j<n;j++)
		{
			g[j][t]=0;
			g[t][j]=0;
		}
		ans=judge();
		
		//cout<<now<<" "<<ans<<endl;
		if(now+1>=ans) printf("City %d is lost.\n",t);
		else printf("Red Alert: City %d is lost!\n",t);
		
		now=ans;		
	}
	if(k==n) printf("Game Over.");
	return 0;
}

L2-023 图着色问题(搜索)

L2-023 图着色问题

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
const int N=500+10;
int n,m,k;
int g[N][N];
int s[N],v[N];
int f=0;
void dfs(int u)
{
	if(f) return;
	v[u]=1;
	for(int i=1;i<=n;i++)
	{
		if(g[u][i])
		{
			if(s[i]==s[u])
			{
				f=1;return;
			}
			else
			{
				if(!v[i]) dfs(i);
			}
		}
	}
}
int main()
{
	cin>>n>>m>>k;
	fir(i,1,m)
	{
		int a,b;cin>>a>>b;
		g[a][b]=1;g[b][a]=1;
	}
	int t;cin>>t;
	while(t--)
	{
		map<int,int>mp;
		fir(i,1,n)
		{
			cin>>s[i];
			mp[s[i]]=1;
		}
		if(mp.size()!=k) puts("No");
		else
		{
			f=0;
			memset(v,0,sizeof(v));
			for(int i=1;i<=n;i++)
			{
				if(!v[i]) dfs(i);
			}
			if(f) puts("No");
			else puts("Yes");
		}
	}
	return 0;
}

L2-025 分而治之(搜索)

L2-025 分而治之

开二维数组会MLE。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
#define pb push_back
typedef long long ll;
const int N=1e4+10;
int n,m;
vector<int>g[N];
int v[N];//-1不能走 1走过了
void dfs(int u)
{
	v[u]=1;
	for(auto x:g[u])
	{
		if(!v[x]) dfs(x);
	}
} 
int main()
{
	cin>>n>>m;
	while(m--)
	{
		int a,b;cin>>a>>b;
		g[a].pb(b);
		g[b].pb(a);
	}
	int k;cin>>k;
	while(k--)
	{
		int t;cin>>t;
		memset(v,0,sizeof(v));
		fir(i,1,t)
		{
			int tt;cin>>tt;v[tt]=-1;
		}
		int f=0;
		for(int i=1;i<=n;i++)
		{
			if(!v[i])
			{
				f++;dfs(i);
			}
		}
		if(f==n-t) puts("YES");
		else puts("NO");
	}
	return 0;
}

L2-026 小字辈(搜索)

L2-026 小字辈

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
#define pb push_back
typedef long long ll;
const int N=1e5+10;
vector<int>g[N];//存孩子 
int n,s;
struct node
{
	int v,d;//val deep
};
vector<node>ans;
int maxn;
bool cmp(node a,node b)
{
	if(a.d!=b.d) return a.d>b.d;
	else return a.v<b.v;
}
void bfs()
{
	queue<node>q;
	q.push({s,1});
	ans.pb({s,1});
	while(q.size())
	{
		node t=q.front();
		q.pop();
		
		maxn=max(maxn,t.d);
		for(auto x:g[t.v])
		{
			node tt={x,t.d+1};
			q.push(tt);
			ans.pb(tt);
		}
	}
}
int main()
{
	cin>>n;
	fir(i,1,n)
	{
		int t;cin>>t;		
		if(t==-1) s=i;//start 
		else g[t].pb(i);
	}
	bfs();
	cout<<maxn<<endl;
	sort(ans.begin(),ans.end(),cmp);
	int f=0;
	for(auto x:ans)
	{
		if(x.d!=maxn) break;
		if(f) cout<<" ";
		f++;cout<<x.v;
	}
	return 0;
}

L2-031 深入虎穴(模板bfs)

L2-031 深入虎穴

注意:入口要判断,不一定是1.

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
#define pb push_back
typedef long long ll;
const int N=1e5+10;
int n;
vector<int>g[N];
struct node
{
	int v,ans;
};
node ans;
int s;//start
void bfs()
{
	queue<node>q;
	q.push({s,0});
	while(q.size())
	{
		node t=q.front();
		q.pop();
		
		for(auto x:g[t.v])
		{
			node tt={x,t.ans+1};
			if(t.ans+1>ans.ans)
			{
				ans=tt;
			}
			q.push(tt);
		}
	}
}
int v[N]; 
int main()
{
	cin>>n;
	fir(i,1,n)
	{
		int m;cin>>m;
		while(m--)
		{
			int t;cin>>t;g[i].pb(t);
			v[t]=1;
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(!v[i]) s=i;
	}
	ans={s,0};
	bfs();
	cout<<ans.v;
	return 0;
}

二叉树题

二叉树的题基本都是递归地用性质得知左右子树范围。

L2-004 这是二叉搜索树吗?(二叉搜索树性质+递归)

L2-004 这是二叉搜索树吗?

此题我们知道了二叉搜索树的性质:左子树小于根,右子树大于等于根。
且输入的是前序遍历,则对一个二叉树[l,r]:a[l]是根,[l+1,r]是左右子树范围。
其中,前x项若都小于根,剩下的都大于等于根:则从l+1开始的前x个就是左子树,剩下的都是右子树。如此就分出了左右子树[l1,r1][l2,r2],然后再对左右子树递归即可。

由于输出要后序遍历,则我们只需:递归左子树,递归右子树,存根 (按照后序遍历的顺序)即可。

递归中注意一些范围。
镜像后的算法同理。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
const int N=1e3+10;
int n,a[N];
vector<int>ans;
int m;
void solve(int l,int r)//[l,r] 其中a[l]是根 
{
	if(r<l) return;
	int i=l+1,j=r;
	if(!m)
	{
		while(a[i]<a[l]&&i<=r) i++;
		while(a[j]>=a[l]&&j>l) j--;
		if(i-j!=1) return;
		solve(l+1,i-1);
		solve(j+1,r);
		ans.pb(a[l]);
	}
	else
	{
		while(a[i]>=a[l]&&i<=r) i++;
		while(a[j]<a[l]&&j>l) j--;
		if(i-j!=1) return;
		solve(l+1,i-1);
		solve(j+1,r);
		ans.pb(a[l]);
	}
}
int main()
{
	cin>>n;
	fir(i,1,n) cin>>a[i];
	m=0;//不镜像 
	solve(1,n);
	if(ans.size()==n)
	{
		puts("YES");int f=0;
		for(auto x:ans)
		{
			if(f) cout<<" ";
			cout<<x;f++;
		}
	}
	else
	{
		ans.clear();m=1;
		solve(1,n);
		if(ans.size()==n)
		{
			puts("YES");int f=0;
			for(auto x:ans)
			{
				if(f) cout<<" ";
				cout<<x;f++;
			}
		}
		else puts("NO");
	}
	
	return 0;
}

L2-006 树的遍历(用后序和中序得出根节点、分出左右子树+递归)

L2-006 树的遍历

这里要用map,因为不知道这是什么形状的二叉树,不知道某个点是否有值。
后序的最后一个是根,用根在中序中分出左右子树,再递归地执行同样步骤。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define mem(a,x) memset(a,x,sizeof(a))
const int N=30+10;
int n,hou[N],zhong[N];
map<int,int>mp;
void solve(int l,int r,int ll,int rr,int now)//后 中  
{
	//后序遍历则hou[r]是根 
	if(l<=r&&ll<=rr)
	{
		mp[now]=hou[r];
		int root=hou[r];
		for(int i=ll;i<=rr;i++)
		{
			if(zhong[i]==root)//找到根了 
			{
				solve(l,i-1-ll+l,ll,i-1,now*2);
				solve(r-rr+i,r-1,i+1,rr,now*2+1);
			}
		}
	}
}
int main()
{
	cin>>n;
	fir(i,1,n) cin>>hou[i];
	fir(i,1,n) cin>>zhong[i];
	solve(1,n,1,n,1);
	int f=0;
	for(auto x:mp)
	{
		if(f) cout<<" ";
		f++;
		cout<<x.second;
	}
	return 0;
}

L2-011 玩转二叉树(中序+前序+递归)

L2-011 玩转二叉树

注意:前序中左子树范围的顺序其实就是左子树中根的顺序,右子树亦然。所以这里递归不需要中序的[l,r],只需要知道根的位置。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define mem(a,x) memset(a,x,sizeof(a))
const int N=30+10;
int n,z[N],q[N];
map<int,int>mp;
//中
void solve(int l,int r,int root,int now)
{
	if(l<=r)
	{
		mp[now]=q[root];
		for(int i=l;i<=r;i++)
		{
			if(q[root]==z[i])
			{		
				solve(l,i-1,root+1,now*2+1);//左子树放到右边 
				solve(i+1,r,root+i+1-l,now*2);//右子树放到左边		
				return;
			}
		}
	}
}
int main()
{
	cin>>n;
	fir(i,1,n) cin>>z[i];
	fir(i,1,n) cin>>q[i];
	solve(1,n,1,1);
	int f=0;
	for(auto x:mp)
	{
		if(f) cout<<" ";
		f++;cout<<x.second;
	}
	return 0;
}

L2-035 完全二叉树的层序遍历(概念+递归)

L2-035 完全二叉树的层序遍历

根据完全二叉树和后序遍历概念递归。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
#define pb push_back
typedef long long ll;
const int N=30+10;
int a[N],n;
map<int,int>mp;
int cnt;
void solve(int idx)
{
	if(idx>n) return;
	solve(idx*2);
	solve(idx*2+1);
	mp[idx]=a[cnt++];
}
int main()
{
	cin>>n;
	fir(i,1,n) cin>>a[i];
	cnt=1;
	solve(1);
	int f=0;
	for(auto x:mp)
	{
		if(f) cout<<" ";
		if(x.second) cout<<x.second;
		f++;
	}
	return 0;
}

并查集题

L2-007 家庭房产

L2-007 家庭房产

一家人弄到一个并查集里,根节点是最小的id。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
const int N=1e4+10;
int n;
struct node
{
	int f,m;
	int child[5];
	int t,sum;
}a[N];
int p[N],v[N];
void ini()
{
	for(int i=0;i<1e4;i++) p[i]=i;
}
int find(int x)
{
	if(p[x]!=x) p[x]=find(p[x]);
	return p[x];
}
void merge(int a,int b)
{
	int aa=find(a),bb=find(b);
	if(aa<bb) p[bb]=aa;//认小的做父 
	else p[aa]=bb;
}
struct nodee
{
	int id,sum;
	double t,m,ans,rt;
	int flag;
}ans[N];
bool cmp(nodee a,nodee b)
{
	if(a.ans!=b.ans) return a.ans>b.ans;
	else return a.id<b.id;
}
int main()
{
	ini();
	cin>>n;
	fir(i,1,n)
	{
		int t;cin>>t;
		v[t]=1;
		cin>>a[t].f>>a[t].m;
		if(a[t].f!=-1) 
		{
			merge(t,a[t].f);
			v[a[t].f]=1;
		}
		if(a[t].m!=-1) 
		{
			merge(t,a[t].m);
			v[a[t].m]=1;
		}
		int k;cin>>k;
		fir(j,0,k-1)
		{
			cin>>a[t].child[j];
			merge(t,a[t].child[j]);
			v[a[t].child[j]]=1;
		}
		cin>>a[t].t>>a[t].sum;
	}
	
	for(int i=0;i<1e4;i++)
	{
		if(v[i])
		{
			int pa=find(i);
			ans[pa].flag=1;
			ans[pa].id=pa;
			ans[pa].sum++;
			ans[pa].t+=a[i].t;
			ans[pa].m+=a[i].sum;
		}
	}
	
	fir(i,0,9999)
	{
		if(ans[i].flag)
		{
			ans[i].ans=ans[i].m/ans[i].sum;
			ans[i].rt=ans[i].t/ans[i].sum;
		}
	}
	
	sort(ans,ans+10000,cmp);
	int idx=0;
	for(int i=0;ans[i].flag;i++) idx++;
	cout<<idx<<endl;
	for(int i=0;ans[i].flag;i++)
	{
		printf("%04d %d %.3f %.3f\n",ans[i].id,ans[i].sum,ans[i].rt,ans[i].ans);
	}
	return 0;
}

L2-010 排座位

L2-010 排座位

朋友放到一个并查集里。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
#define pb push_back
typedef long long ll;
const int N=1e2+10;
int g[N][N];
int n,m,k;
int p[N];
void ini()
{
	for(int i=1;i<=100;i++) p[i]=i;
}
int find(int x)
{
	while(p[x]!=x) x=p[x];
	return p[x];
}
void merge(int a,int b)
{
	int aa=find(a),bb=find(b);
	p[aa]=bb;//认b作父 
}
int main()
{
	ini();
	cin>>n>>m>>k;
	while(m--)
	{
		int a,b,c;cin>>a>>b>>c;
		if(c==1)
		{
			merge(a,b);
		}
		else g[a][b]=g[b][a]=-1;
	}
	while(k--)
	{
		int a,b;cin>>a>>b;
		int fa=find(a),fb=find(b);	
		
		if(fa==fb)
		{
			if(g[a][b]!=-1) puts("No problem");
			else puts("OK but...");
		}	
		else
		{
			if(g[a][b]!=-1) puts("OK");
			else puts("No way");
		}		
	}
	
	return 0;
}

L2-024 部落

L2-024 部落

find的函数用while竟然会T,用递归才不会,我不理解…

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
const int N=1e4+10;
int n;
int p[N];
void ini()
{
	for(int i=1;i<=9999;i++) p[i]=i;
}
//find函数如果写while(x!=p[x])  x=p[x]; 会TLE! 
int find(int x)
{
	if(x!=p[x]) p[x]=find(p[x]);
	return p[x];
}
void merge(int a,int b)
{
	int aa=find(a),bb=find(b);
	p[bb]=aa;//认aa做父 
}
map<int,int>mp;
set<int>s;
int main()
{
	ini();
	scanf("%d",&n);
	
	while(n--)
	{
		int k;scanf("%d",&k);
		k--;
		int t;scanf("%d",&t);
		mp[t]=1;
		int tt=find(t);
		while(k--)
		{
			int temp;scanf("%d",&temp);mp[temp]=1;
			merge(t,temp);
//			int pa=find(temp);
//			p[pa]=tt;		
		}
	}
	cout<<mp.size()<<" ";
	for(auto x:mp)
	{
		int pa=find(x.first);
		s.insert(pa);
	}
	cout<<s.size()<<endl;
	
	int m;cin>>m;
	while(m--)
	{
		int a,b;scanf("%d%d",&a,&b);
		int aa=find(a),bb=find(b);
		if(aa==bb) puts("Y");
		else puts("N");
	}
	return 0;
}

数据结构题

L2-012 关于堆的判断(堆)

L2-012 关于堆的判断

注意:要从下往上调整。因为这样只有/2这一种方式。若从上往下,则有x2和x2+1两种方式,答案就不唯一了。

这题知道堆调整的实现方式即可。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
#define pb push_back
typedef long long ll;
const int N=1e3+10;
int a[N],n,m;
void adjust(int x)//关键
{	
	while(x>=2)
	{
		if(a[x]<a[x/2]) swap(a[x],a[x/2]);
		x/=2;
	}
}
int main()
{
	cin>>n>>m;
	fir(i,1,n)
	{
		cin>>a[i];
		adjust(i);
	}
	while(m--)
	{
		int num1;cin>>num1;
		string str1;cin>>str1;
		if(str1=="is")
		{
			string str2;cin>>str2>>str2;
			if(str2=="root")
			{
				if(a[1]==num1) puts("T");
				else puts("F");
			}
			else if(str2=="parent")
			{
				string t;cin>>t;int num2;cin>>num2;
				int f=0;
				for(int i=1;i<=n;i++)
				{
					if(a[i]==num2&&a[i/2]==num1) f=1;
				}
				if(f) puts("T");
				else puts("F");
			}
			else if(str2=="child")
			{
				string t;cin>>t;int num2;cin>>num2;
				int f=0;
				for(int i=1;i<=n;i++)
				{
					if(a[i]==num1&&a[i/2]==num2) f=1;
				}
				if(f) puts("T");
				else puts("F");
			}
		}
		else
		{
			string temp;
			int num2;cin>>num2;cin>>temp>>temp;
			int f=0;
			for(int i=1;i<=n;i++)
			{
				if(a[i]==num1&&a[i+1]==num2&&a[i/2]==a[(i+1)/2]) f=1;
				else if(a[i]==num2&&a[i+1]==num1&&a[i/2]==a[(i+1)/2]) f=1;
			}
			if(f) puts("T");
			else puts("F");
		}
	}
	return 0;
}
  • 7
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

karshey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值