pat练习(1140,1141,1142,1143)

总结:

这次做的还行,模拟92,但是还是有些点过不去。

(1)注意细节,1141是double类型的score求和然后再取整,不然最后一个点过不去。

(2)1141的数据用char *类型,不然可能会超时。

(3)英语不好是硬伤。

(4)注意细节

 

pat-1140(简单模拟)

思路:

eg:D->D1(表示D,连续数量是1),D1->D111(D,数量1;1连续数量是1),以此类推。

#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
map <char,int> mp;
int vis[120000];
int main(void)
{
	int x,y,i,j,tp,cnt;
	scanf("%d%d",&x,&y);
	string s1="",s2,ss;
	s1+=(char)(x+'0');y--;
	while(y--){
		int len=s1.length();
		s2="";mp.clear();
		i=0;memset(vis,0,sizeof(vis));
		for(i=0;i<len;i++){
			cnt=1;
			while(s1[i]==s1[i+1]) i++,cnt++;
			vis[i]=cnt;
			ss="";s2+=s1[i];
			if(cnt>=10){
				while(cnt){
				ss+=(char)(cnt%10+'0');cnt/=10;
				}
				reverse(ss.begin(),ss.end());s2+=ss;
			}
			else s2+=(char)(cnt+'0');
		}
		s1=s2;//cout<<s1<<endl;
	}
	cout<<s1;
	return 0;
}

 

pat-1141(细节+排序)

思路:

就是sort函数排序,但是如果序号数给出,并且比较小,就用char*;

score求和就先求和再变int类型(这里错了好久)。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
const int maxn = 100100;
struct Node{
	int rk,num;
	double score;
	char sch[20];
}cur[maxn];
map <string,int> mp;
bool cmp(Node a,Node b)
{
	if(a.score!=b.score) return a.score>b.score;
	else{
		if(a.num!=b.num) return a.num<b.num;
		else return strcmp(a.sch,b.sch)<0;
	}
}
int main(void)
{
	int n,m,i,j,x,y,len,pos=0;
	double tp;
	char id[20],sc[20];
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%s %d %s",id,&x,sc);
		if(id[0]=='A') tp=x;
		else if(id[0]=='B') tp=x/1.5;
		else if(id[0]=='T') tp=x*1.5;
		for(j=0,len=strlen(sc);j<len;j++)
		if(sc[j]>='A'&&sc[j]<='Z') sc[j]=sc[j]-'A'+'a';
		if(!mp.count(sc)){
			mp[sc]=++pos;
			cur[pos].score=tp;
			cur[pos].num=1;
			strcpy(cur[pos].sch,sc);
		}
		else{
			len=mp[sc];
			cur[len].num++;
			cur[len].score+=tp;
		}
	}
	for(i=1;i<=pos;i++) cur[i].score=(int)(cur[i].score);
	printf("%d\n",pos);
	sort(cur+1,cur+pos+1,cmp);
	cur[0].score=-1;
	for(i=1;i<=pos;i++){
		if(cur[i].score!=cur[i-1].score) cur[i].rk=i;
		else cur[i].rk=cur[i-1].rk;
		printf("%d %s %.0lf %d\n",cur[i].rk,cur[i].sch,cur[i].score,cur[i].num);
	}
	return 0;
}

 

pat-1142(图的模拟)

思路:

clique n. 派系,小圈子

最多200个点,判断一下给出的点是否两两相连,可判断是不是完全图,

如果是,再从剩余的点中判断是否有点让它还是完全图(这里我没从1-n,好后悔)。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int vis[220],mp[220][220],a[220];
int main(void)
{
	int n,m,k,i,j,x,y,ns,fg;
	cin>>n>>m;
	memset(mp,0,sizeof(mp));
	for(i=0;i<m;i++){
		cin>>x>>y;
		mp[x][y]=mp[y][x]=1;
	}
	cin>>k;
	while(k--){
		cin>>ns;fg=0;
		memset(vis,0,sizeof(vis));
		for(i=0;i<ns;i++){
			cin>>a[i];vis[a[i]]=1;
			if(fg==0){
				for(j=0;j<i;j++)
				if(mp[a[i]][a[j]]==0){
					fg=1;break;
				}
			}
		}
		if(fg==0){
			int ff=0;
			for(i=1;i<=n;i++)
			if(vis[i]==0){
				for(j=0;j<ns;j++)
				if(mp[a[j]][i]==0) break;
				if(j==ns){
					ff=1;break;
				}
			}
			if(ff==1) cout<<"Not Maximal"<<endl;
			else cout<<"Yes"<<endl;
		}
		else cout<<"Not a Clique"<<endl;
	}
	return 0;
}

 

pat-1143(LCA+BST)

思路:似乎很难,但是有机关,不存在的点不用判断,

存在的点直接找最LCA就行了,因为是先序遍历,所以最先找的肯定是根节点,所以不用建树,

直接遍历节点看哪个节点最先符合BST的根节点的值大于左子树的值,小于右子树的值的条件,

它就是最近祖先。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
const int maxn = 100100;
int a[maxn],n,m;
map <int,int> mp;
void Find(int x,int y)
{
	for(int i=1;i<=n;i++){
		if((a[i]>=x&&a[i]<=y)||(a[i]<=x&&a[i]>=y)){
			if(a[i]==x) printf("%d is an ancestor of %d.\n",x,y);
			else if(a[i]==y) printf("%d is an ancestor of %d.\n",y,x);
			else printf("LCA of %d and %d is %d.\n",x,y,a[i]);
			return ;
		}
	}
}
int main(void)
{
	int i,x,y;
	cin>>m>>n;
	for(i=1;i<=n;i++) cin>>a[i],mp[a[i]]=i;
	while(m--){
		cin>>x>>y;
		if(mp[x]==0&&mp[y]==0) printf("ERROR: %d and %d are not found.\n",x,y);
		else if(mp[x]==0||mp[y]==0) printf("ERROR: %d is not found.\n",mp[x]==0?x:y);
		else Find(x,y);
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值