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

T1 奖牌的数量
题目描述
小爱获得了 a 枚金牌,她获得的银牌数量比金牌多 b 枚,她获得的铜牌数量比银牌多 c 枚。请问她一共获得了多少枚奖牌?
输入格式
第一行:单个整数表示 a;
第二行:单个整数表示 b;
第三行:单个整数表示 c。
输出格式
单个整数:表示奖牌总数。
数据范围
0≤a,b,c≤1000
样例数据
输入:
1
2
3
输出:
10
说明:
金牌1枚,银牌3枚,铜牌6枚,共10枚

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

T2 打印B型
题目描述
小爱想用 * 打印出一个形如大写字母B的图案。例如 n=2 时,输出:


当 n=3 时输出:


给定一个整数 n,n 表示期望的字形大小。请输出一个由星号组成的,对应大小的B字形图案。该字形由 2n+1 行组成,具体请参考样例。
输入格式
单个整数:表示 n。
输出格式
共 2n+1 行,表示一个B字形图案。
数据范围
1≤n≤50。
样例数据
输入:
4
输出:

 

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
	int n;
	scanf("%d",&n);
	int h=2*n+1;
	for(int i=1;i<=h;i++){
		if(i==1||i==(n+1)||i==h){
			for(int j=1;j<=2*n-1;j++) printf("*");
			printf("\n");
		}
		else {
			for(int j=1;j<=2*n;j++)
				if(j==1||j==2*n) printf("*");
				else  printf(" ");
			printf("\n");
		}
	}
    return 0;
}

 T3 IP地址
题目描述
IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址。
IPv4协议中规定使用32位二进制数字(4个字节)来表示计算机的IP地址,这个二进制数字通常被分割为4个"8位二进制数",用"点分十进制" 表示成a.b.c.d的形式,其中a,b,c,d均小于等于255。
32位二进制数字中:
第1位~第8位二进制数字所对应的十进制数字为a
第9位~第16位二进制数字所对应的十进制数字为b
第17位~第24位二进制数字所对应的十进制数字为c
第25位~第32位二进制数字所对应的十进制数字为d
例如:32位二进制数字为:11000000 10101000 00000001 01100100中,
11000000对应十进制数字192
10101000对应十进制数字168
00000001对应十进制数字1
01100100对应十进制数字100
应此该二进制所对应的IP地址位192.168.1.100
现给定一个32位的二进制数字,请你将它转换为对应IP地址
输入格式
输入共一行:32位二进制数字
输出格式
输出共一行:表示其对应IP地址,四个十进制数字之间用"."隔开
数据范围
数据保证输入的32位二进制数字合法
样例数据
输入:
11000000101010000000000101100100
输出:
192.168.1.100
说明:
见题面解释

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
	char a;
	for(int i=1;i<=4;i++){
		int ans=0;
		for(int j=1;j<=8;j++){
			a=getchar();
			if(a=='1') ans+=pow(2.0,(8-j));			
		}
		if(i==1) printf("%d",ans);
		else printf(".%d",ans);
	}	
    return 0;
}

T4 降雨统计
题目描述
最近正值雨季,小爱希望通过观察气象云图来预测城市每个未知的降雨时间。已知小爱居住的城市可以看成n×m的方格图,每个方格表示一个地区,该地区上空天气共两种情况:
晴空万里,用字符 '.' 表示,表示该地区无降雨
乌云密布,用字符 '#' 表示,表示该地区正在降雨
据小爱观察,乌云以每分钟1个方格的速度向右移动,乌云到达某地区时,该地区就会有降雨过程,乌云离境后,降雨停止。
现给定t=0时刻时,每个地区上空天气情况,请你帮小爱统计每个地区的降雨时间。
输入格式
输入第一行:两个正整数n,m
接下去n行,每行m个字符,每个字符对应该地区上空天气情况。
输出格式
输出共n行,每行m个数字,用空格隔开,第i行第j个数字表示 (i,j) 方格对应地区的总降雨时间。
数据范围
对于30%的数据:1≤n,m≤10
对于60%的数据:1≤n,m≤100
对于100%的数据:1≤n,m≤1000

样例数据
输入:
4 4
..#.
####
##..
.#..
输出:
0 0 1 1
1 2 3 4
1 2 2 2
0 1 1 1
说明:
样例输出第一行说明:
(1,1),(1,2)两区域没有乌云过境,不会下雨,总降雨时间为0
(1,3)地区在t=0时下雨,而后不再下雨,总降雨时间为1
(1,4)地区在t=1时刻下雨(乌云由(1,3)向右飘来),而后不再下雨,总降雨时间为1

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int f[1005][1005];
int main()
{
	int n,m;
	string a;
	bool t;
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++){
		cin>>a;t=true;
		for(int j=1;j<=m;j++){
			if(a[j-1]=='#'){f[i][j]=f[i][j-1]+1;t=false;}
			else if(a[j-1]=='.'&& !t) f[i][j]=f[i][j-1];
			printf("%d ",f[i][j]);
		}
		printf("\n");
	}
    return 0;
}

T5 平衡点
题目描述
给定一个由 n 个整数组成的数列a1,a2 ,⋯,an,请为这个数列找到一个平衡点,使得平衡点左侧与右侧的引力尽量接近。
若平衡点为ak,则左侧引力定义为数列中下标小于 kk 的各个元素到 ak的距离乘以这些元素大小的总和。同理,右侧引力定义为数列中下标大于 k 的每个元素到 ak的距离乘以这些元素大小的总和。
例如 n=6,若选 a4为平衡,左侧的引力计算公式为:
L=a1×(4−1)+a2×(4−2)+a3×(4−3)
右侧引力计算公式为:
R=a5×(5−4)+a6×(6−4)
请找到一个最佳平衡点,并输出选择该点为平衡点时,左右引力之差绝对值的最小值。
输入格式
第一行:单个整数表示 n;
第二行:nn 个整数表示 a1,a2,⋯,an。
输出格式
单个整数:表示在选择了最佳平衡点的前提下,两侧引力之差绝对值的最小值。
数据范围
0≤ai≤1,000;
对于 30% 的数据,3≤n≤10,000;
对于 60% 的数据,3≤n≤50,000;
对于 100% 的数据,3≤n≤100,000。
样例数据
输入:
4
1 2 3 4
输出:
0
说明:
3号位为平衡点

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int n;
long long a[100005];//数组
long long pre[100005],suf[100005];//前缀和 后缀和
long long ans,L,R;//最小值 左值 右值
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) {
		scanf("%lld",&a[i]);
		pre[i]=pre[i-1]+a[i];//前缀和
		ans+=a[i]*(i-1);//初始为最大
	}
	for(int i=n;i>=1;i--)
		suf[i]=suf[i+1]+a[i];//后缀和
	R=ans;
	for(int i=1;i<=n;i++){
		L+=pre[i];
		R-=suf[i+1];
		ans=min(ans,abs(L-R));
	}
	printf("%lld",ans);	
    return 0;
}

Guess you like

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