Advertisement

上海市计算机学会竞赛平台2020年6月月赛丙组

阅读量:

切蛋糕

内存限制: 256 Mb时间限制: 1000 ms

题目描述

一个圆型的蛋糕,切 𝑛n 刀后,最多能将蛋糕分成多少块?例如 𝑛=3n=3 时,最多可以分成 77 块,如下图:

1591882459.png
输入格式
  • 单个整数:表示切割的次数 𝑛n。
输出格式
  • 单个整数:表示最多能将蛋糕切成多少份。
数据范围
  • 1≤𝑛≤50001≤n≤5000。
样例数据

输入:

1

输出:

2

输入:

3

输出:

7

复制代码
 #include<iostream>

    
 int main()
    
 {
    
 int n;
    
 std::cin >> n;
    
 std::cout << 1 + (n + 1) * n / 2 << “\n”;
    
 }

单词替换

内存限制: 256 Mb时间限制: 1000 ms

题目背景

最近,谷歌公司做出了一项决定,由于 black list(黑名单)这个词语涉及对有色人种的歧视,所以需要将它们修改成 block list(屏蔽名单)。

题目描述

给定一个仅仅由小写字母组成的字符串 𝑠s,请将其中所有的 black 全部替换成 block

输入格式

单个字符串:表示需要替换的字符串 𝑠s。

输出格式

单个字符串:表示将 black 替换成 block 后的字符串。

数据范围

设字符串的长度为 ∣𝑠∣∣s∣,则

  • 对于 50%50% 的数据,1≤∣𝑠∣≤2001≤∣s∣≤200;
  • 对于 100%100% 的数据,1≤∣𝑠∣≤2000001≤∣s∣≤200000。
样例数据

输入:

ablacklistblackmatter

输出:

ablocklistblockmatter

复制代码
 #include <bits/stdc++.h>

    
 using namespace std;
    
 int main(){
    
 	string a;
    
 	cin >> a;
    
 	for(int i=0;i<a.size()-4;i++){
    
 		if(a[i]=='b' and a[i+1]=='l' and a[i+2]=='a' and a[i+3]=='c' and a[i+4]=='k'){
    
 			a[i+2]='o';
    
 		}
    
 	}
    
 	cout << a;
    
 }

打印K型

内存限制: 256 Mb时间限制: 1000 ms

题目描述

小爱想用 * 打出一个大写的 K。例如 𝑛=3n=3 时,输出

复制代码
 **   *** **  ** ** * *** ** * **  ** **   ***

给定一个整数 𝑛n 表示字形的大小。请输出一个由星号组成的,对应大小的 K 字形图案。该字形由 2𝑛+12n+1 行组成,第一笔竖线固定占两列,第二笔折线会根据参数 𝑛n 适当调整粗细,具体请参考样例。

输入格式

单个整数表示 𝑛n。

输出格式

共 2𝑛+12n+1 行,表示一个 K 字形图案。

数据范围

1≤𝑛≤501≤n≤50

样例数据

输入:

5

输出:

复制代码
 ** ***** **    **** **   *** **  ** ** * *** ** * **  ** **   *** **    **** ** *****

输入:

7

输出:

复制代码
 ** ******* ** ****** ** ***** **    **** **   *** **  ** ** * *** ** * **  ** **   *** **    **** ** ***** ** ****** ** *******
复制代码
 #include <bits/stdc++.h>

    
 using namespace std;
    
 int main(){
    
 	int n;
    
 	cin >> n;
    
 	for(int i=n;i>=1;i--){
    
 		cout << "**";
    
 		for(int j=0;j<i;j++){
    
 			cout << " ";
    
 		}
    
 		for(int j=0;j<i;j++){
    
 			cout << "*";
    
 		}
    
 		cout << endl;
    
 	}
    
 	cout << "***";
    
 	cout << endl;
    
 	for(int i=1;i<=n;i++){
    
 		cout << "**";
    
 		for(int j=0;j<i;j++){
    
 			cout << " ";
    
 		}
    
 		for(int j=0;j<i;j++){
    
 			cout << "*";
    
 		}
    
 		cout << endl;
    
 	}
    
 }

牛奶供应

内存限制: 256 Mb时间限制: 1000 ms

题目描述

有一家牧场每天都会产出牛奶,在第 𝑖i 天,牛奶的产量为 𝑝𝑖pi​。生产的牛奶可以卖到市场上,在第 𝑖i 天,市场需求为 𝑐𝑖ci​。如果市场需求不大,卖不掉牛奶,则多余的牛奶就会放进冷库保存。牛奶有一个保鲜期,如果超过了 𝑚m 天 (𝑚m 为一个给定的整数),就必须倒掉了。卖牛奶时,应先卖冷藏时间长的。

给定天数 𝑛n 以及每天的产量和收购量,请求出牧场一共可以卖出多少牛奶。

输入格式

第一行:两个整数 𝑛n 和 𝑚m;
第二行到第 𝑛+1n+1 行:第 𝑖+1i+1 行每行两个整数表示 𝑝𝑖pi​ 和 𝑐𝑖ci​。

输出格式

单个整数表示答案。

数据范围
  • 对于 30%30% 的数据,1≤𝑛,𝑚≤10001≤n,m≤1000;
  • 对于 60%60% 的数据,1≤𝑛,𝑚≤100001≤n,m≤10000;
  • 对于 100%100% 的数据,1≤𝑛,𝑚≤1000001≤n,m≤100000;
  • 0≤𝑝𝑖,𝑐𝑖≤100000≤pi​,ci​≤10000。
样例数据

输入:

5 2
50 0
100 0
250 0
300 0
1000 5000

输出:

1550

说明:

最后一天的收购量很大,但第一天和第二天的牛奶由于过期不能出售了

输入:

5 5
0 2
2 3
5 0
3 0
2 0

输出:

2

复制代码
 #include <bits/stdc++.h>

    
 using namespace std;
    
 int p[100000],c[100000];
    
 int a=0,b=0;
    
 int main (){
    
 	int n,m;
    
 	cin >>n >>m;
    
 	for(int i=1;i<=n;i++){
    
 		cin >>p[i] >>c[i];
    
 	}
    
 	for(int i=1;i<=n;i++){ 
    
 		for(int j=i;j<=n;j++){
    
 			a++;
    
 			if(a>m+1){ 
    
 				break;
    
 			}
    
 			if(c[j]!=0){
    
 				if(c[j]>=p[i]){
    
 					b=b+p[i];
    
 					c[j]=c[j]-p[i]; 
    
 					break;
    
 				}else{
    
 					b=b+c[j];
    
 					p[i]=p[i]-c[j];
    
 					c[j]=0;
    
 				}
    
 			}
    
 			
    
 		}
    
 		a=0;
    
 	}
    
 	cout <<b;
    
 }

影厅选座

内存限制: 256 Mb时间限制: 1000 ms

题目描述

小爱和朋友们去看电影,一共需要购买 𝑘k 张电影票。电影院共有 𝑛n 排 𝑚m 列,合计 𝑛×𝑚n×m 个座位。有些位置已经占了,小爱希望和朋友能够做得近一点。请你找在电影院里找一个矩形区域,该区域能够包含 𝑘k 个空座,且面积达到最小。

输入格式

第一行:三个整数 𝑛n,𝑚m 及 𝑘k;
接下来 𝑛n 行,每行 𝑚m 个字符,X 表示座位已被预定,. 表示可选。

输出格式

若电影院空座不足 𝑘k 个,输出 No Solution,否则输出一个整数,表示包含 𝑘k 个空座的最小矩形面积。

数据范围
  • 对于30%30%的数据,1≤𝑛,𝑚≤501≤n,m≤50;
  • 对于60%60%的数据,1≤𝑛,𝑚≤2001≤n,m≤200;
  • 对于100%100%的数据,1≤𝑛,𝑚≤8001≤n,m≤800;
  • 1≤𝑘≤𝑛×𝑚1≤k≤n×m。
样例数据

输入:

3 3 4
XXX
XX.
XX.

输出:

No Solution

说明:

影厅不足4个空位

输入:

4 5 5
..XXX
X.XXX
XX.X.
XX...

输出:

6

说明:

右下角2*3的矩型中包含5个空位

复制代码
 #include <bits/stdc++.h>

    
 using namespace std;
    
 int n, m, k, a[810][810], b[810], l, r,  ans = 1e8;
    
 char c[810][810];
    
 int main() {
    
 	cin >> n >> m >> k;
    
 	for(int i = 1; i <= n; i++)
    
 		for(int j = 1; j <= m; j++) {
    
 			cin >> c[i][j];
    
 			if(c[i][j] == '.') a[i][j] = 1;
    
 			a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];
    
 		}
    
 	if(a[n][m] < k) {
    
 		cout << "No Solution";
    
 		return 0;
    
 	}
    
 	for(int i1 = 1; i1 <= n; i1++)
    
 		for(int i2 = 0; i2 < i1; i2++) {
    
 			l = 1;
    
 		    for(int j = 1; j <= m; j++) {
    
 				b[j] = a[i1][j] - a[i2][j];
    
 				while(b[j] - b[l - 1] >= k) {
    
 					ans = min(ans, (i1 - i2) * (j - l + 1));
    
 					l++;
    
 				}
    
 			}
    
 		}
    
 	cout << ans;
    
 }

全部评论 (0)

还没有任何评论哟~