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

T1 植树造林
题目描述
在植树节,小爱种了 a 棵树、小艾种了 b 棵树, 小哀种了 c 棵树。老师准备帮助学生补种一些树,使得三人的植树数量相等。请问老师最少应该种多少树,才能使三人的种树数量保持一致?
输入格式
单独一行:三个自然数 a,b 与 c。
输出格式
单个自然数:表示需要补种的最少数量。
数据范围
0≤a≤1000;
0≤b≤1000;
0≤c≤1000。
样例数据
输入:
2 1 3
输出:
3
输入:
4 4 2
输出:
2

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
	int a,b,c,maxn=0;
	cin>>a>>b>>c;
	maxn=max(max(a,b),c);
	cout<<(maxn-a)+(maxn-b)+(maxn-c)<<endl;
    return 0;
}

T2 数球数
题目描述
体育馆里有三种球:足球,篮球和排球。已知:
足球和篮球共有 a 个;
篮球和排球共有 b 个;
排球和足球共有 c 个。
请问足球,篮球和排球分别各有几个?
输入格式
第一行:一个自然数 a,表示足球和篮球共有 a 个;
第二行:一个自然数 b,表示篮球和排球共有 b 个;
第三行:一个自然数 c,表示排球和足球共有 c 个;
保证输入数据合理,不存在矛盾情况。
输出格式
第一行:一个自然数,表示足球的数量;
第二行:一个自然数,表示篮球的数量;
第三行:一个自然数,表示排球的数量。
数据范围
0≤a≤10000;
0≤b≤10000;
0≤c≤10000。
样例数据
输入:
8
5
7
输出:
5
3
2

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
	int a,b,c;
	cin>>a>>b>>c;
	int z,l,p;
	p=(a+b+c)/2-a;
	z=c-p;
	l=b-p;
	cout<<z<<endl<<l<<endl<<p<<endl;
    return 0;
}

T3 驼峰与蛇
题目描述
有两种对变量命名的方法:
驼峰命名法——变量名中的单词首字母大写,单词之间不加空格或者其他字符,直接拼接。比如 MyFirstName,DataCenter 等。
蛇形命名法——变量名中出现的单词字母全部小写,单词之间用一个下划线 _ 相连,比如 my_first_name,data_center 等。
给定一个用驼峰法命名的变量名,请将它转成蛇形命名法的形式。
输入格式
一个字符序列,由英文大写或小写字母组成,保证第一个字符是大写的。
输出格式
一个字符序列:表示用下划线分割后的结果。
数据范围
设 ∣s∣ 表示输入序列的长度:
对于 30% 的数据,的有 1≤∣s∣≤100;
对于 60% 的数据,的有 1≤∣s∣≤50,000;
对于 100% 的数据,的有 1≤∣s∣≤1,000,000。
样例数据
输入:
HowAreYou
输出:
how_are_you
输入:
Good
输出:
good

#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
	string a;
	cin>>a;
	int la=a.size();
	for(int i=0;i<la;i++){
		if(i==0) cout<<(char)(a[i]+32);
		else if(a[i]>='A'&&a[i]<='Z')cout<<"_"<<(char)(a[i]+32);
		else cout<<a[i];
	}
    return 0;
}

T4 整除
题目描述
给定 nn 个数字构成的一个多重集合:a1,a2,⋯,an,请求出,其中有多少元素不能被任意一个在集合中的其他元素整除?
多重集合是指允许出现多个相等元素的集合。
输入格式
第一行:单个正整数 n;
第二行:n 个数字表示 a1,a2,⋯,an。
输出格式
单个自然数:表示集合中不能被其他数字整除的数字个数。
数据范围
1≤ai≤1,000,000;
对于 50% 的数据:1≤n≤10000;
对于 100% 的数据:1≤n≤100000。
样例数据
输入:
5
3 5 13 9 16
输出:
4
说明:
3,5,13,16均不能被集合中其他数整除,而9可以被3整除

#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
int f[100005];
int p[10000005];
int main()
{
	int n,i,j,ans=0;
	cin>>n;
	for(i=0;i<n;i++)cin>>f[i];
	sort(f,f+n);
	for(i=0;i<n;i++){
		//将重复的数子去掉(互为倍数)
		if(f[i]==f[i+1]){
			j=f[i];
			while(j<=f[n-1]){
				p[j]=1;j+=f[i];
			}
			while(f[i]==f[i+1])i++;
			continue;
		}
		if(!p[f[i]])ans++;
		j=f[i];
		while(j<=f[n-1]){
			p[j]=1;j+=f[i];
		}
	}
	cout<<ans<<endl;
    return 0;
}

T5 城市的中心
题目描述
有一些大城市的道路,都是相互平行或垂直的,所以在城市间行走,不能用两点间的欧几里得距离计算长度,而是应该使用曼哈顿距离计算长度。两点间的曼哈顿距离定义如下:设两点的坐标分别为 (x,y) 与 (x',y'),它们之间的曼哈顿距离定义为|x-x'|+|y-y'|
给定二维平面上的 n 个点的坐标,请在二维平面上找到一个中心点,使得给定的这些点到这个中心点的曼哈顿距离之和最小,输出这个最小值。
输入格式
第一行:单个正整数 n。
第二行到第 n+1 行:第 i+1 行有两个整数 xi和 yi ,表示一个点的坐标。
输出格式
单个自然数:表示最优中心到各个点的曼哈顿距离之和。
数据范围
−5000≤xi,yi≤5000;
对于 30% 的数据,1≤n≤20;
对于 60% 的数据,1≤n≤2000;
对于 100% 的数据,1≤n≤100000;
样例数据
输入:
4
1 0
0 1
-1 0
0 -1
输出:
4
说明:
最优中心应该设置在(0,0)处

#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
int n,ans;
struct nod{
	int x,y;
}v[100005];
bool cmpx(nod a,nod b){return a.x<b.x;}
bool cmpy(nod a,nod b){return a.y<b.y;}
int main()
{
	cin>>n;
	for(int i=0;i<n;i++) cin>>v[i].x>>v[i].y;
	sort(v,v+n,cmpx);int xx=v[n/2].x;
	sort(v,v+n,cmpy);int yy=v[n/2].y;
	for(int i=0;i<n;i++){
		ans+=abs(v[i].x-xx);ans+=abs(v[i].y-yy);
	}
	cout<<ans<<endl;
    return 0;
}

Guess you like

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