赛后总结2018-10-04

网站:http://yloj.yali.edu.cn/v3

A.队列
问题描述

CZ 是一所非常文明的学校,尤其是 CZ 的男生们,十分的谦让女同学。每天
中午,CZ 的同学们会在食堂排队打饭。一开始,队列的顺序是由进入食堂的顺
序决定的。但是不一会儿,男生们觉得在女生之前打饭非常的尴尬,开始主动地
谦让退让。
让我们来更准确地᧿述这种情况。我们将队列里的 N 个人用从 1 到 N 的整数
标号,其中,标号为 1 的人是离食堂窗口最近的。接着,假如在第 X 秒,有一个
男生在 i 号位上,而有一个女生在(i+1)号位上,那么在第 X+1 秒,那个男生会
退让到 i+1 号位置,而女生会到 i 号位置。时间是按秒进行的。
现在,你已经知道了一开始的队列,请你求出经过 T 秒后的队列是什么样子
的。

Input

第 1 行 2 个整数,分别表示排队同学的总数 N 和经过的秒数 T,
1 ≤ N,T ≤ 50。
第 2 行一个长度为 N 的字符串 S,S[i]为 B,表示位置 i 上的是一个男生,
S[i]为 G,表示位置 i 上的是一个女生。

Output

输出一行一个字符串,表示 T 秒后的队列。

Sample Input

5 2
BGGBG

Sample Output

GGBGB

Hint
【输入样例 2】

4 1
GGGB

【输出样例 2】

GGGB

思路:这道题就是一个典型的水题,只需要做一个简单的模拟操作即可,但是我仍然没有AC,是因为题目之前的样例有误,后来教练提醒才知道了,浪费了大量时间23333

#include <bits/stdc++.h>
using namespace std;
const int maxn=100000+10;
char s[maxn];
int t,n;
int main(){
	cin>>n>>t;
	for(int i=1;i<=n;i++){
		cin>>s[i];
	}
	for(int i=1;i<=t;i++){
		int k[maxn]={0};
		for(int j=1;j<n;j++){
			if(s[j]=='B'&&s[j+1]=='G')
			   k[j]=1;
		}
		for(int j=1;j<=n;j++)
		    if(k[j]==1) {
				char p;
				p=s[j];
				s[j]=s[j+1];
				s[j+1]=p;
			}
	}
	for(int i=1;i<=n;i++)
	    cout<<s[i];
	return 0;
}

第二题:

B. 晋级

一项编程比赛共有 N 位选手参赛,分为预赛和决赛两轮。比赛规定,在预赛
中分数不为 0,并且比排名第 K 的选手(按分数从大到小)高或与排名第 K 的选手
相等的选手可以晋级决赛。
请你写一个简单的程序,求出能有多少选手晋级决赛。

Input

第 1 行 2 个整数,分别表示选手的总数 N 和比赛要求的晋级参数 K。
第 2 行: N 个整数,分别表示每个选手的预赛分数 Ai。
数据保证:1<=K<=N<=50,1<=Ai<=100

Output

输出一行一个整数 M,表示晋级决赛的人数。

Sample Input

8 5
10 9 8 7 7 7 5 5

Sample Output

6

Hint

【输入样例 2】
4 2
0 0 0 0
【输出样例 2】
0

就是一道简单的排序题。
代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn=1000+10;
int a[maxn];
int n,k;
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++) 
		cin>>a[i];
	sort(a+1,a+n+1);
//	for(int i=1;i<=n;i++)
//	    cout<<a[i]<<" ";
	int pop=a[n-k+1],ans=0;
//	cout<<pop<<endl;
	for(int i=1;i<=n;i++)
	    if(a[i]>=pop&&a[i]!=0)
		 ans++;
	cout<<ans;
	return 0;
}
C. 公约数公倍数

小 T 是个多才多艺的同学,不仅擅长国画,还是个数学爱好者,他小学六年级就代表龙
城书院参加了“华罗庚金杯”少年数学邀请赛。最近小 T 对最大公约数和最小公倍数产生
浓厚的兴趣,并学会了用辗转相除法求两个自然数的最大公约数,但小 T 并不满足于会用
转相除法,他是一个酷爱钻研的人,无论学什么都喜欢刨根问底,他想能不能把这个问题反
过来,即已知两个自然数 A 和 B 的最大公约数 G 和最小公倍数 L,问有多少对满足条件的自
然数对 A 和 B?

Input

仅有一行包含两个用空格隔开的自然数 G 和 L,数据保证 L 一定是 G 的倍数并且满足 1≤G≤L≤1,000,000,000。

Output

包含若干行,每行输出一对自然数 A 和 B(A≤B),它们满足 GCD(A,B)=G,
LCM(A,B)=L。这里 GCD(A,B)表示 A 和 B 的最大公约数,LCM(A,B) 表示 A 和 B 的最小公倍数。输出时要求按照 A(每行第一个数)从小到大输出,两数之间严格用一个空格隔开,行末不能有空格。

Sample Input

4 48

Sample Output

4 48
12 16

Hint

【样例解释】
两个数的最大公约数要等于 4、最小公倍数要等于 48,这两个数只可能是 4 和 48 或者 12 和 16,因为 4 比 12 小,所以第一行输出 4 和 48,第二行输出 12 和 16。
【友情提醒】
对于任意两个自然数 A 和 B 都有,A*B=GCD(A,B)*LCM(A,B),即两个自然数之积等于它们的最大公约数与最小公倍数之积,这一点对你思考问题和检验结果都会有所帮助。
【数据规模】
30%的数据满足:1≤G≤L≤500
50%的数据满足:1≤G≤L≤10,000
100%的数据满足:1≤G≤L≤1,000,000,000

这道题是一道数学题:

#include<bits/stdc++.h> 
using namespace std;
long long n,m,x;
int gcd(int x,int y){
	if(y==0)
	   return x;
	else
   	   return gcd(y,x%y);
}
int main() { 
    cin>>n>>m; 
    long long x=m*n; 
    for(long long i=n;i<=m;i+=n) { 
         if(i*i>x)   
		    break; 
         if(x%i==0&&gcd(i,x/i)==n) 
            cout<<i<<" "<<x/i<<endl; 
    }  
    return 0; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值