2019 CCCC-GPLT 练习赛(三)

7-1  计算物体下落的距离

思路: 演草纸计算,输出。

int main(){
	printf("height = 45.00\n");
}

7-2  含有8的数字的个数

思路:暴力

int main(){
	int a,b;scanf("%d%d",&a,&b);
	int ans=0;
	for(int i=a;i<=b;++i){
		int res=i;
		while(res){
			if(res%10==8){
				ans++;break;
			}
			res/=10;
		}
	}printf("%d\n",ans);
}

7-3  鸡兔同笼

思路:减去鸡,就是兔子。

int main(){
	int n,m;scanf("%d%d",&n,&m);
	printf("%d %d\n",n-((m-2*n)/2),(m-2*n)/2);
}

7-4  到底有多二

思路:暴力。

char s[MAXN];

int main(){
	scanf("%s",&s);int len=strlen(s);
	if(s[0]=='-'){
		double ans;
		if((s[len-1]-'0')%2==0)ans=3.0;
		else	ans=1.5;
		int res2=0;
		for(int i=1;i<len;++i){
			if(s[i]=='2'){
				++res2;
			}
		}ans*=((res2*1.0)/((len-1)*1.0));
		printf("%.2lf%%\n",ans*100);
	}
	else{
		double ans;
		if((s[len-1]-'0')%2==0)ans=2.0;
		else	ans=1.0;
		int res2=0;
		for(int i=0;i<len;++i){
			if(s[i]=='2'){
				++res2;
			}
		}ans*=((res2*1.0)/((len)*1.0));
		printf("%.2lf%%\n",ans*100);
	}
}

7-5  大炮打蚊子

思路:暴力
 

int mp[25][25];
int fx[4]={0,0,-1,1},fy[4]={1,-1,0,0};
int n,m;

void debug(){
	for(int i=0;i<n;++i){
		for(int j=0;j<m;++j){
			printf("%d",mp[i][j]);
		}printf("\n");
	}printf("\n");
}
int main(){
	cin>>n>>m;
	char ch;
	for(int i=0;i<n;++i){
		for(int j=0;j<m;++j){
			cin>>ch;
			if(ch=='#')mp[i][j]=2;
			else	mp[i][j]=0;
		}
	}int k,x,y;cin>>k;
	while(k--){
		cin>>x>>y;
		int res=0;
		if(mp[x][y]>0){
			mp[x][y]=0;++res;
		}
		for(int i=0;i<4;++i){
			int nx=x+fx[i],ny=y+fy[i];
			//printf("%d %d\n",nx,ny);
			if(mp[nx][ny]==1){
				mp[nx][ny]=0;++res;
			}
			else if(mp[nx][ny]==2){
				mp[nx][ny]=1;
			}//debug();
		}cout<<res<<endl;
	}
}

7-6  一帮一

思路:顺序+倒序查找

int main(){
	int n;cin>>n;
	int sex[55];string name[55];
	for(int i=1;i<=n;++i){
		cin>>sex[i]>>name[i];
	}int num=n;
	for(int i=1;i<=n&&num>0;++i){
		for(int j=n;j>=i;--j){
			if((sex[i]==1&&sex[j]==0)||(sex[i]==0&&sex[j]==1)){
				sex[i]=sex[j]=2;num-=2;
				cout<<name[i]<<" "<<name[j]<<endl;
			}
		}
	}
	
}

7-7   Left-pad

思路:水题

char s[101000];

int gets(){
	char ch=getchar();int i=0;
	while(ch=getchar()){
		if(ch=='\n')return i;
		s[i++]=ch;
	}
}
int main(){
	int n;char ch;cin>>n>>ch;
	int len=gets();//cout<<len<<endl;
	if(len>=n){
		for(int i=len-n;i<len;++i){
			cout<<s[i];
		}cout<<endl;
	}
	else{
		for(int i=1;i<=n-len;++i){
			cout<<ch;
		}cout<<s<<endl;
	}
}

7-8  古风排版 

思路:记录,结构体排序

const int MAXN=1e5+10;
const int INF32=0x3f3f3f3f;
const ll INF64=0x3f3f3f3f3f3f3f3f;
const int mod=998244353;
const double PI=acos(-1.0);

struct node{
	char ch;
	int first,second;
	node(char _ch='\0',int _first=0,int _second=0){
		ch=_ch;first=_first;second=_second;
	}
}ans[MAXN];
char s[MAXN];

int gets(){
	char ch=getchar();int i=0;
	while(ch=getchar()){
		if(ch=='\n') return i;
		s[i++]=ch;
	}
}
int cmp(node a,node b){
	if(a.first==b.first)
		return a.second>b.second; 
	return a.first<b.first;
}
int main(){
	int n;cin>>n;
	int len=gets();
	for(int i=0;i<len;++i){
		ans[i]=node(s[i],i%n,i);
		if(i==len-1&&i%n!=n-1){
			while(i%n!=n-1){
				++i;
				ans[len++]=node(' ',i%n,i);
			}
		}
	}sort(ans,ans+len,cmp);
	for(int i=0;i<len;++i){
		if(ans[i].first!=ans[i+1].first) cout<<ans[i].ch<<endl;
		else cout<<ans[i].ch;
	}
}

7-9  点赞狂魔

思路:map记录,结构体排序。

const int MAXN=1e4+10;
const int INF32=0x3f3f3f3f;
const ll INF64=0x3f3f3f3f3f3f3f3f;
const int mod=998244353;
const double PI=acos(-1.0);

struct node{
	string name;
	int kind,k;
}peo[MAXN];
map<int,int> mp;
int n;

int cmp(node a,node b){
	if(a.kind==b.kind)
		return a.k<b.k;
	return a.kind>b.kind;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;++i){
		mp.clear();
		cin>>peo[i].name>>peo[i].k;
		int val,ecnt=0;
		for(int j=1;j<=peo[i].k;++j){
			cin>>val;
			if(mp[val]==0){
				mp[val]=++ecnt;
				++peo[i].kind;
			}
		}
	}sort(peo+1,peo+1+n,cmp);
	if(n<3){
		for(int i=1;i<=n;++i){
			cout<<peo[i].name<<" ";
		}cout<<"-";
		for(int i=2;i<=3-n;++i){
			cout<<" -";
		}cout<<endl;
	}
	else{
		cout<<peo[1].name<<" "<<peo[2].name<<" "<<peo[3].name<<endl;
	}
}

7-10  列出连通集

思路:DFS,BFS板子

const int MAXN=5+10;
const int INF32=0x3f3f3f3f;
const ll INF64=0x3f3f3f3f3f3f3f3f;
const int mod=998244353;
const double PI=acos(-1.0);

int mp[MAXN][MAXN];
int vis[MAXN],ans[MAXN];
int n,m,k;

void dfs(int u){
	for(int i=0;i<n;++i){
		if(vis[i]==0&&mp[u][i]==1){
			vis[i]=1;
			ans[k++]=i;
			dfs(i);
		}
	}
}
void bfs(int u){
	queue<int> que;que.push(u);vis[u]=1;
	while(que.size()){
		u=que.front();que.pop();
		ans[k++]=u;
		for(int i=0;i<n;++i){
			if(vis[i]==0&&mp[u][i]==1){
				que.push(i);vis[i]=1;
			}
		}
	}
}
int main(){
	cin>>n>>m;int a,b;
	for(int i=1;i<=m;++i){
		cin>>a>>b;
		mp[a][b]=mp[b][a]=1;
	}
	for(int i=0;i<n;++i){
		k=1;
		if(vis[i]==0){
			vis[i]=1;ans[k++]=i;
			dfs(i);
			cout<<"{";
			for(int i=1;i<k;++i){
				cout<<" "<<ans[i];
			}cout<<" }"<<endl;
		}
	}clean(vis,0);
	for(int i=0;i<n;++i){
		k=1;
		if(vis[i]==0){
			vis[i]=1;ans[k++]=i;
			bfs(i);
			cout<<"{";
			for(int i=2;i<k;++i){
				cout<<" "<<ans[i];
			}cout<<" }"<<endl;
		}
	}
}

7-11  部落

思路:简单并查集+map

const int MAXN=1e5+10;
const int INF32=0x3f3f3f3f;
const ll INF64=0x3f3f3f3f3f3f3f3f;
const int mod=998244353;
const double PI=acos(-1.0);

int pre[MAXN];
map<int,int> mp;
int n;

void intt(){
	for(int i=1;i<MAXN;++i){
		pre[i]=i;
	}mp.clear();
}
int Find(int x){
	if(pre[x]==x) return x;
	else return pre[x]=Find(pre[x]);
}
int main(){
	intt();cin>>n;
	int ecnt=0;
	for(int i=1;i<=n;++i){
		int k,first,peo;cin>>k;
		for(int i=1;i<=k;++i){
			cin>>peo;
			if(mp[peo]==0)mp[peo]=++ecnt;
			if(i==1){
				first=peo;
			}int aa=Find(mp[first]),bb=Find(mp[peo]);
			if(aa!=bb){
				pre[bb]=aa;
			}
		}
	}int ans=0;
	for(int i=1;i<=ecnt;++i){
		if(pre[i]==i)ans++;
	}cout<<ecnt<<" "<<ans<<endl;
	int k,a,b;cin>>k;
	while(k--){
		cin>>a>>b;
		if(Find(mp[a])==Find(mp[b])) cout<<"Y"<<endl;
		else cout<<"N"<<endl;
	}
}

7-12  素因子分解

思路:唯一分解定理

const int MAXN=1e5+10;
const int INF32=0x3f3f3f3f;
const ll INF64=0x3f3f3f3f3f3f3f3f;
const int mod=998244353;
const double PI=acos(-1.0);

ll ans[MAXN][2];
ll n;

int main(){
	cin>>n;ll res=n,k=0;
	if(n==1){
		cout<<"1=1"<<endl;
		return 0;
	}
	for(ll i=2;i*i<=n;++i){
		if(res%i==0){
			int sum=0;
			while(res%i==0){
				res=res/i;++sum;
			}ans[k][0]=i;ans[k++][1]=sum;
		}
	}
	if(res>1){
		ans[k][0]=res;ans[k++][1]=1;
	}cout<<n<<"="<<ans[0][0];
	if(ans[0][1]>1)	cout<<"^"<<ans[0][1];
	for(int i=1;i<k;++i){
		cout<<"*"<<ans[i][0];
		if(ans[i][1]>1)	cout<<"^"<<ans[i][1];
	}cout<<endl;
	
}

7-13  函数-斐波那契数列

思路:看题

const int MAXN=1e5+10;
const int INF32=0x3f3f3f3f;
const ll INF64=0x3f3f3f3f3f3f3f3f;
const int mod=998244353;
const double PI=acos(-1.0);

double f[MAXN];

void intt(){
	f[1]=1;f[2]=1;f[3]=2;
	for(int i=4;i<=60;++i){
		f[i]=f[i-1]+f[i-2];
	}
}
int main(){
	int n;intt();
	while(~scanf("%d",&n)) printf("%.0lf\n",f[n]);
}

7-14  括号匹配

思路:栈

const int MAXN=1e5+10;
const int INF32=0x3f3f3f3f;
const ll INF64=0x3f3f3f3f3f3f3f3f;
const int mod=998244353;
const double PI=acos(-1.0);

string s;
stack<char> stk;

int gets(){
	char ch=getchar();int i=0;
	while(ch=getchar()){
		if(ch=='\n') return i;
		s[i++]=ch;
	}
}
int main(){
	//int len=gets();//printf("%d\n",len);
	getline(cin,s);int len=s.size();
	//scanf("%s",s);int len=strlen(s); 
	while(!stk.empty()) stk.pop();
	for(int i=0;i<len;++i){
		if(s[i]=='('||s[i]==')'||s[i]=='{'||s[i]=='}'||s[i]=='['||s[i]==']'){
			if(!stk.empty()){
				char ch=stk.top();
				if((ch=='{'&&s[i]=='}')||(ch=='('&&s[i]==')')||(ch=='['&&s[i]==']')){
					stk.pop();continue;
				}
			}stk.push(s[i]);
		}
	}
	if(!stk.empty()) printf("no\n");
	else printf("yes\n");
}

7-15  反向数相加

思路:模拟

const int MAXN=1e5+10;
const int INF32=0x3f3f3f3f;
const ll INF64=0x3f3f3f3f3f3f3f3f;
const int mod=998244353;
const double PI=acos(-1.0);


int main(){
	int n;cin>>n;
	for(int i=1;i<=n;++i){
		ll a,b;cin>>a>>b;
		int res1=a,res2=b,aa=0,bb=0;
		while(res1){
			aa=aa*10+res1%10;
			res1/=10;
		}
		while(res2){
			bb=bb*10+res2%10;
			res2/=10;
		}aa=aa+bb;
		ll ans=0;
		while(aa){
			ans=ans*10+aa%10;
			aa/=10;
		}cout<<ans<<endl;
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值