团体程序设计天梯赛-练习集L1

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lidengdengter/article/details/88809326

 

 

目录

L1-002 打印沙漏  

L1-003 个位数统计

L1-006 连续因子 

L1-009 N个数求和

L1-011 A-B

L1-020 帅到没朋友

L1-023 输出GPLT 

L1-027 出租

L1-043 阅览室

L1-049 天梯赛座位分配

L1-056 猜数字


L1-002 打印沙漏  

先判断层数,对半处理

#include<cstdio>
char map[10][10];

int main(){
	int n;char c;
	while(~scanf("%d %c",&n,&c)){
		int i,cnt=1,num=1;
		for(i=3;;i+=2){
			if(num+2*i>n) break;
			num+=2*i;
			cnt++;
		}
		i-=2;
		int res=n-num;
		//printf("%d\n",num);
		//printf("%d--%d\n",i,cnt);
		for(int j=0;j<cnt;j++){
			int cmp=j;
			while(cmp--) printf(" ");
			for(int k=0;k<i-2*j;k++){
				printf("%c",c);
			}
			printf("\n");
		}
		for(int j=cnt-2;j>=0;j--){
			int cmp=j;
			while(cmp--) printf(" ");
			for(int k=0;k<i-2*j;k++){
				printf("%c",c);
			}
			printf("\n");
		}
		printf("%d\n",res);
	}
	return 0;
}

L1-003 个位数统计

map使用

#include<cstdio>
#include<cstring>
#include<map>
#include<iostream>
using namespace std;
map<char,int>v;

int main(){
	char s[1005];
	cin.getline(s,1005);
	for(int i=0;i<strlen(s);i++)
		v[s[i]]++;
		
	map<char,int>::iterator it;
	for(it=v.begin();it!=v.end();it++){
		printf("%c:%d\n",it->first,it->second);
	}
	return 0;
}

L1-006 连续因子 

暴力求

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;


int main(){
	int n;
	while(~scanf("%d",&n)){
		int len=0,st=0;
		for(int i=2;i<=(int)sqrt(n);i++){
			ll tmp=1;
			for(int j=i;j*tmp<=n;j++){
				tmp*=j;
				if(n%tmp==0&&j-i+1>len){
					st=i;
					len=j-i+1;
				} 
			}
		}
		if(st==0) st=n,len=1;
		printf("%d\n%d",len,st);
		for(int i=st+1;i<st+len;i++)
			printf("*%d",i);
		printf("\n");
	}
	return 0;
}

L1-009 N个数求和

化简计算化简再计算

#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
ll a[105],b[105];

ll gcd(ll a,ll b){
	return b==0?a:gcd(b,a%b);
}

int main(){
	int n;
	while(~scanf("%d",&n)){
		for(int i=0;i<n;i++){
			scanf("%lld/%lld",&a[i],&b[i]);
			ll tmp=gcd(abs(a[i]),b[i]); //化简 
			a[i]/=tmp;b[i]/=tmp;
		}
			
		ll fz=a[0],fm=b[0];
		for(int i=1;i<n;i++){
			fz=fz*b[i]+a[i]*fm;
			fm=fm*b[i];
			
		} 
		
		if(fz==0){
			printf("0\n");
			continue;
		}
		
		ll tmp=gcd(abs(fz),fm); //化简 
		fz/=tmp;fm/=tmp;
		
		if(fz/fm){
			ll z=fz/fm;
			fz-=z*fm;
			if(fz==0)
				printf("%lld\n",z);
			else
				printf("%lld %lld/%lld\n",z,fz,fm);
		}
		else
			printf("%lld/%lld\n",fz,fm);
	}
	return 0;
}

L1-011 A-B

初始化字符串A中字符都为真,在B中重设为假,输出状态为真即可

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=1e4+5;

int main(){
	char s[N],d[N];
	bool vis[N];
	while(cin.getline(s,N)){
		for(int i=0;i<strlen(s);i++){
			vis[s[i]]=true;
		}
		cin.getline(d,N);
		for(int i=0;i<strlen(d);i++){
			vis[d[i]]=false;
		}
		
		for(int i=0;i<strlen(s);i++)
			if(vis[s[i]])
				printf("%c",s[i]);
		printf("\n");
	}
	return 0;
}

L1-020 帅到没朋友

记录判断,注意k的范围

#include<cstdio>
const int N=1e5+5;
bool vis[N];

int main(){
	int n,k,m,x;
	while(~scanf("%d",&n)){
		while(n--){
			scanf("%d",&k);
			for(int i=0;i<k;i++){
				scanf("%d",&x);
				if(k>1) vis[x]=true;
			}
		}
		scanf("%d",&m);
		int cnt=0;
		for(int i=0;i<m;i++){
			scanf("%d",&x);
			if(!vis[x]){
				cnt++;
				if(cnt==1)
					printf("%05d",x);
				else printf(" %05d",x);
				vis[x]=true;
			}
		}
		if(cnt==0)
			printf("No one is handsome");
		printf("\n");
	}
	return 0;
}

L1-023 输出GPLT 

两种写法(emmmm差不多)

#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
using namespace std;
const int N=1e4+5;
char s[N];
int p[5];
char ans[]={'G','P','L','T'};
int main(){
	while(~scanf("%s",s)){
		memset(p,0,sizeof(p));
		for(int i=0;i<strlen(s);i++){
			if(s[i]=='g'||s[i]=='G') p[0]++;
			if(s[i]=='p'||s[i]=='P') p[1]++;
			if(s[i]=='l'||s[i]=='L') p[2]++;
			if(s[i]=='t'||s[i]=='T') p[3]++;
		}
		int sum=p[0]+p[1]+p[2]+p[3];
//		for(int i=0;i<sum;i++){             //写法一 
//			if(p[0]) printf("G"),p[0]--;
//			if(p[1]) printf("P"),p[1]--;
//			if(p[2]) printf("L"),p[2]--;
//			if(p[3]) printf("T"),p[3]--;
//		}
//		printf("\n");
		while(sum--){                       //写法二 
			for(int i=0;i<4;i++){
				if(p[i]){
					printf("%c",ans[i]);
					p[i]--;
				}
			}
		}
		printf("\n");
	}
	return 0;
}

L1-027 出租

数字记录后排序再加上下标标签即可

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;

struct node{
	int id;
}p[10];
int a[10];

bool cmp1(int a,int b){
	return a>b;
}

int main(){
	char s[12];
	bool vis[12];
	while(cin.getline(s,15)){
		memset(vis,false,sizeof(vis));
		int cnt=0,len=strlen(s);
		for(int i=0;i<len;i++)
			if(!vis[s[i]-'0']){
				a[cnt++]=s[i]-'0';
				vis[s[i]-'0']=true;
			}
		sort(a,a+cnt,cmp1);

		for(int i=0;i<cnt;i++)
			p[a[i]].id=i;
			
		int ans[12];
		for(int i=0;i<len;i++){
			ans[i]=p[s[i]-'0'].id;
		}
		
		printf("int[] arr = new int[]{%d",a[0]);
		for(int i=1;i<cnt;i++)
			printf(",%d",a[i]);
		printf("};\n");
		
		printf("int[] index = new int[]{%d",ans[0]);
		for(int i=1;i<len;i++)
			printf(",%d",ans[i]);
		printf("};\n");	
		
	}
	return 0;
}

L1-043 阅览室

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

struct node{
	char op;
	int h1,m1;
	int h2,m2;
}p[1005];

bool vis[1005];
int main(){
	int n,t=0;
	scanf("%d",&n);
	while(t<n){
		memset(vis,false,sizeof(vis));
		int id,h,m,cnt=0;
		double sum=0;
		while(true){
			
			char op;
			scanf("%d %c %d:%d",&id,&op,&h,&m);
	
			if(id==0){
				if(cnt==0) printf("0 0\n");
				else printf("%d %.0f\n",cnt,sum/cnt);
				t++;
				break;
			}

			p[id].op=op;
			//printf("%c\n",op);
			if(op=='S'){	
				p[id].h1=h;
				p[id].m1=m;
				vis[id]=true;
			}
			else if(op=='E'){
				p[id].h2=h;
				p[id].m2=m;
			 									
				if(vis[id]){
					if(p[id].m2<p[id].m1){
						p[id].m2+=60;
						p[id].h2-=1;
					}
					int tmp=(p[id].m2-p[id].m1)+(p[id].h2-p[id].h1)*60;
					//printf("tmp=%d\n",tmp);
					cnt++;
					sum+=tmp;
					vis[id]=false;
				}
			}
		}
	}
	return 0;
}

L1-049 天梯赛座位分配

模拟

#include<cstdio>
#include<vector>
#include<cstring>
using namespace std; 
int a[105];
bool vis[105];
int main(){
	int n;
	vector<int>ans[105];
	while(~scanf("%d",&n)){
		int sum=0;
		for(int i=0;i<n;i++){
			scanf("%d",&a[i]);
			a[i]*=10;
			sum+=a[i];
		}
		
		memset(vis,false,sizeof(vis));
		int cnt=0,num=0;
		for(int i=1;;){
			for(int j=0;j<n;j++){
				if(ans[j].size()<a[j]){ //未排好号 
					cnt++;
					ans[j].push_back(i); 
					if(num+1==n)  //最后一个队 
						i+=2;
					else
						i+=1;
				}
				if(!vis[j]&&ans[j].size()>=a[j]){ //排好号 
					vis[j]=true;
					num++;
				}
				
			}
			if(cnt==sum) //全部排好 
				break;
		}
		
		for(int i=0;i<n;i++){
			printf("#%d\n",i+1);
			for(int j=0;j<ans[i].size();j++){
				if(j%10!=0)
					printf(" ");
				printf("%d",ans[i][j]);
				if(j%10==9)
					printf("\n");
			}
		}	
	}
	return 0;
}

L1-056 猜数字

#include<cstdio>
#include<cmath>
using namespace std;
const int N=1e4+4;
struct node{
	char s[10];
	int num;
}p[N];

int main(){
	int n,sum=0;
	while(~scanf("%d",&n)){
		for(int i=0;i<n;i++){
			scanf("%s %d",p[i].s,&p[i].num);
			sum+=p[i].num;
		}
		
		sum/=2*n;
		int minx=abs(p[0].num-sum);
		int k=0;
		for(int i=1;i<n;i++){
			int tmp=abs(p[i].num-sum);
			if(tmp<minx){
				k=i;
				minx=tmp;
			}
		}
		printf("%d %s\n",sum,p[k].s);
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/lidengdengter/article/details/88809326