上海市青少年算法2021年9月月赛(丙组)

T1 做烧饼
题目描述
做好一只烧饼,需要把烧饼的两面都加热。给定两个正整数 n 与 k,n 表示需要做的烧饼数量,而 k 表示厨房里有 k 口锅,每口锅每分钟能做好一面烧饼。请计算至少需要多少分钟才能做完所有的烧饼。
输入格式
单独一行:两个正整数 n 与 k。
输出格式
单个正整数:表示需要多少分钟才能做好所有烧饼。
数据范围
1≤n≤10000
1≤k≤10000
样例数据
输入:
3 2
输出:
3
说明:
第一分钟加热第一只和第二只烧饼的正面
第二分钟加热第一只烧饼的反面和第三只烧饼的正面
第三分钟加热第二只烧饼的反面和第三只烧饼的反面

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
	int n,k;
	cin>>n>>k;
	if(n*2<=k) cout<<2<<endl;
	else cout<<ceil(n*2.0/k)<<endl;
    return 0;
}

T2 正规数的判定
题目描述
如果一个正整数的所有素因子均不超过 5,则它被称为正规数(Regular Number)。例如 60 是一个正规数,因为 60=2^2*3*5,1000 也是一个正规数,因为 1000=2^3*5^3。前十五个正规数为:1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24
给定一个正整数 n,请判定它是否是一个正规数。
输入格式
单个正整数:表示 n。
输出格式
如果 nn 是正规数,输出 Regular Number;
如果不是,输出 Irregular Number;
数据范围
对于30% 的数据,1≤n≤10^5;
对于60% 的数据,1≤n≤10^9;
对于100% 的数据,1≤n≤10^18。
样例数据
输入:
60
输出:
Regular Number
输入:
26
输出:
Irregular Number

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
	long long n;
	cin>>n;
	while(n%2==0) n/=2;
	while(n%3==0) n/=3;
	while(n%5==0) n/=5;
	if(n==1) cout<<"Regular Number"<<endl;
	else cout<<"Irregular Number"<<endl;
    return 0;
}

T3 股票市场
题目描述
小爱知道一只股票在今后 n 天的价格。在第一天开始前,小爱有 m 元,那么在最后一天结束后,她最多能有多少钱呢?小爱每天都可以买入或卖出股票,注意股票在交易时的最小单位为 1 股。例如当有 13 元的时候,若股价为 4 元一股,则最多只能买 3 股。
输入格式
第一行:两个整数,表示 n 和 m;
第二行:n 个整数 a1,…,an,表示每天的股票价格。
输出格式
单个整数:表示能获得的最大钱数。
数据范围
1≤m≤100;
1≤ai≤20;
对于 30% 的数据,1≤n≤20;
对于 60% 的数据,1≤n≤5,000;
对于 100% 的数据,1≤n≤100,000;
保证输出答案不超过 10^18。
样例数据
输入:
3 10
1 2 3
输出:
30
说明:
第一天以1元的价格买进10股,到了最后一天以3元的价格卖出,10元变成了30元
输入:
4 100
40 20 10 5
输出:
100
说明:
没有买股票
输入:
6 100
1 2 10 1 5 10
输出:
10000

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int a[100005][2];
int main()
{
	int n,m,t=0;
	bool flag=true;
	scanf("%d %d %d",&n,&m,&a[1][0]);
	for(int i=2;i<=n;i++){
		scanf("%d",&a[i][0]);
		if(a[i][0]>a[i-1][0] && flag){
			flag=false;
			a[i-1][1]=1;
			t=m/a[i-1][0];
			m=m-(m/a[i-1][0])*a[i-1][0];
		}
		else if(a[i][0]<a[i-1][0]&& !flag){
			flag=true;
			m+=t*a[i-1][0];
			t=0;
		}
	}
	if(!flag) m+=t*a[n][0];
	cout<<m<<endl;
    return 0;
}

T4 最年长的人
题目描述
给定 n 个人的出生日期,请找出其中年龄最大的,并输出他的出生日期。
输入格式
第一行:单个正整数 n;
第二行到第n+1行:每行格式如下:
首先有一个四位数 y 表示年份;
接下来有一个两位数 m 表示月份;
最后有一个两位数 d 表示日期;
年、月、日之间以一个减号 - 隔开。
输出格式
输出年龄最大的人的出生日期,格式同输入。
数据范围
对于 50%的数据,1≤n≤1,000;
对于 100%的数据,1≤n≤1,000,000;
1900≤y≤2020;
保证月份和日期都是两位数且是合理的日期。
样例数据
输入:
4
2008-08-08
1953-06-15
1949-10-01
1926-08-18
输出:
1926-08-18

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
struct St_old{
	int y,m,d;
}s[1000005];
bool mycmp(St_old a,St_old b){
	if(a.y==b.y){
		if(a.m==b.m) return a.d<b.d;
		else return a.m<b.m;
	}
	else return a.y<b.y;
}
int main()
{
	int n; scanf("%d",&n);
	for(int i=0;i<n;i++) scanf("%d-%d-%d",&s[i].y,&s[i].m,&s[i].d);
	sort(s,s+n,mycmp);
	printf("%04d-%02d-%02d",s[0].y,s[0].m,s[0].d);
    return 0;
}

T5 分数化小数
题目描述
给定一个以十进制表示的分数 a/b,保证 a<b,请将它化成一个二进制的小数。若存在循环节,用圆括号表示循环节。例如:
1/4=0.01
7/8=0.111
1/5=0.(0011)
输入格式
两个整数:表示 a 与 b。
输出格式
一串数字:表示 a/b 的二进制小数表示。
数据范围
对于 30% 的数据,1≤a<b≤30;
对于 60% 的数据,1≤a<b≤5,000;
对于 100% 的数据,1≤a<b≤2,000,000;
样例数据
输入:
1 4
输出:
0.01
输入:
7 8
输出:
0.111
输入:
1 5
输出:
0.(0011)

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int f[2000005][2];
int v[2000005];
int main()
{
	int a,b,t,i=1,j; 
	scanf("%d %d",&a,&b);
	bool flag=true;
	while(a%b!=0&&flag){
		if(v[a]==1){
			flag=false;t=a;break;
		}
		f[i][1]=a;v[a]=1;f[i][0]=a*2.0/b;
		a*=2;a-=f[i][0]*b;
		i++;
	}
	printf("0.");
	if(!flag){
		for(j=1;f[j][1]!=t;j++)printf("%d",f[j][0]);
		printf("(");
		for(;j<i;j++)printf("%d",f[j][0]);
		printf(")");
	}
	else for(j=1;j<i;j++)printf("%d",f[j][0]);
    return 0;
}

Guess you like

Origin blog.csdn.net/lybc2019/article/details/121352042