蓝桥杯算法训练合集 十六 1.首字母变大写2.盾神计科导作业3.Cinema4.接水问题

目录

1.首字母变大写

2.盾神计科导作业

3.Cinema

4.接水问题


1.首字母变大写

问题描述

对一个字符串中的所有单词,如果单词的首字母不是大写字母,则把单词的首字母变成大写字母。在字符串中,单词之间通过空白符分隔,空白符包括:空格(' ')、制表符('\t')、回车符('\r')、换行符('\n')

输入格式

输入一行:待处理的字符串(长度小于80)

输出格式

输出一行:转换后的字符串。

样例输入

if so, you already have a google account. you can sign in on the right.

样例输出

If So, You Already Have A Google Account. You Can Sign In On The Right.

示例代码

#include
#include
int main(){
	char a[256];
	gets(a);
	int len=strlen(a);
	int flag=1;
	for(int i=0;i='a' && a[i]<='z'){//如果是单词字母
			if(flag==1){//如果是首字母
				printf("%c",a[i]-32);
				flag=0;
			}
			else{
				printf("%c",a[i]);
			}
		}
		else{
			flag=1;
			printf("%c",a[i]);
		}
	}
}

2.盾神计科导作业

问题描述

盾神由于最近沉迷于电影赏析中忘记完成计算机导论的作业,为了加快他完成作业的进程他提出了一个简化版模拟cpu运行的问题。
现在一共有16个寄存器(编号为16进制),初始时每个寄存器内部然后给定一串操作序列(具体操作内容如下),然后顺序输出操作序列结束后的寄存器的值。
操作:
0abc 把值bc(十六进制表示下)存入寄存器a。
10ab 把寄存器b的值存入a。
2rab 把寄存器a,b的和存入r。
3rab 把寄存器a,b的or存入r。
4rab 把寄存器a,b的and存入r。
5rab 把寄存器a,b的xor存入r。
6000 停止。
字母均为大写。
假设寄存器能存储的数字大小为maxint。

输入格式

每行一条指令。

输出格式

顺序一行输出每个寄存器的值(表示为10进制)。

样例输入

0011
0122
2312

样例输出

17 34 51 0 0 0 0 0 0 0 0 0 0 0 0 0

数据规模和约定

输入数据指令个数小于10000条。

示例代码

#include
using namespace std;
int shiliuzhuanshi(char n) {
	int n1;
	if ('0' <= n && n <= '9') {
		n1 = int(n) - 48;
	}
	else {
		n1 = int(n) - 55;
	}
	return n1;
}
int huo(int a, int b) {
	int c = 0, temp1[16] = { 0 }, temp2[16] = { 0 };
	int temp = 32768;
	for (int i = 0; i < 16; i++) {
		temp1[i] = a / temp;
		a = a % temp;
		temp /= 2;
	}
	temp = 32768;
	for (int i = 0; i < 16; i++) {
		temp2[i] = b / temp;
		b = b % temp;
		temp /= 2;
	};
	temp = 32768;
	for (int i = 0; i < 16; i++) {
		if (temp1[i] == 1 || temp2[i] == 1) {
			c += temp * 1;
		}
		temp /= 2;
	}
	return c;
}
int yu(int a, int b) {
	int c = 0, temp1[16] = { 0 }, temp2[16] = { 0 };
	int temp = 32768;
	for (int i = 0; i < 16; i++) {
		temp1[i] = a / temp;
		a = a % temp;
		temp /= 2;
	}
	temp = 32768;
	for (int i = 0; i < 16; i++) {
		temp2[i] = b / temp;
		b = b % temp;
		temp /= 2;
	};
	temp = 32768;
	for (int i = 0; i < 16; i++) {
		if (temp1[i] == 1 && temp2[i] == 1) {
			c += temp * 1;
		}
		temp /= 2;
	}
	return c;
}
int yihuo(int a, int b) {
	int c = 0, temp1[16] = { 0 }, temp2[16] = { 0 };
	int temp = 32768;
	for (int i = 0; i < 16; i++) {
		temp1[i] = a / temp;
		a = a % temp;
		temp /= 2;
	}
	temp = 32768;
	for (int i = 0; i < 16; i++) {
		temp2[i] = b / temp;
		b = b % temp;
		temp /= 2;
	};
	temp = 32768;
	for (int i = 0; i < 16; i++) {
		if (temp1[i] != temp2[i]) {
			c += temp * 1;
		}
		temp /= 2;
	}
	return c;
}
int a[16] = { 0 };

int main() {
	string str;
	while (cin>>str) {
		int a1 = int(str[0]) - 48;//字符串第一位
		int a2 = shiliuzhuanshi(str[1]);//字符串第二位
		int a3 = shiliuzhuanshi(str[2]);//字符串第三位
		int a4 = shiliuzhuanshi(str[3]);//字符串第四位
		if (a1 == 0) {//a3和a4组成的16进制数以10进制存入寄存器a2中
			a[a2] = a3 * 16 + a4;
		}
		else if (a1 == 1) {//a4寄存器存入a3中
			a[a3] = a[a4];
		}
		else if (a1 == 2) {//a3和a4寄存器的值的和存入a2寄存器中
			a[a2] = a[a3] + a[a4];
		}
		else if (a1==3) {
			a[a2] = huo(a[a3], a[a4]);
		}
		else if (a1 == 4) {
			a[a2] = yu(a[a3], a[a4]);
		}
		else if (a1 == 5) {
			a[a2] = yihuo(a[a3], a[a4]);
		}
		else {
			break;
		}
	}
	for (int i = 0; i < 16; i++) {
		cout << a[i] << " ";
	}
	return 0;
}

3.Cinema

问题描述

给你一个n行m列的01矩阵A,每个元素初始值为0,
再给你k个这样的操作:
给出(xi,yi),你得按要求找出(ai,bi),
将矩阵A的点(ai,bi)赋值为1,并且输出(ai,bi).
要求如下:
1.A(ai,bi)==0.
2.满足1的情况下 , (ai,bi)与(xi,yi)的曼哈顿距离尽可能小.
3.若存在多个(ai,bi)满足条件2 , 则选出ai最小的.
4.若存在多个(ai,bi)满足条件3 , 则选出bi最小的.

输入格式

输入第一行三个正整数n,m,k , 分别表示行数,列数,操作数.
接下来k行每行包含两个正整数xi,yi , 意义见问题描述.

输出格式

共k行 , 每行输出你所求出的ai,bi .

样例输入

3 4 6
1 1
1 1
1 1
1 2
1 3
1 3

样例输出

1 1
1 2
2 1
1 3
1 4
2 3

样例输入

4 3 12
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2

样例输出

2 2
1 2
2 1
2 3
3 2
1 1
1 3
3 1
3 3
4 2
4 1
4 3

福利数据一

5 3 0

福利数据二

2 5 4
2 3
1 3
1 5
2 3

数据规模和约定

对于10%的数据,乃福利数据.
另有10%的数据,n=1,m<=2000.
另有20%的数据,n,m<=100.
另有20%的数据,n,m<=400.
剩余60%的数据,n,m<=2000.
对于所有数据满足0<=k<=min(100000,n*m) , 1<=xi<=n , 1<=yi<=m .

备注一

为了不黑P党,时限从1.3s改成3s,不过大家应在1.3s内通过为好.

备注二

下面是原题面,由于可能存在的"调侃"行为不再使用:
由于清澄完善的功能导至本人娱乐过度玩脱了,所以原题面暂时丢失.

示例代码

#include
using namespace std;
int n, m, k;
int A[10000][10000] = { 0 }, B[10000][10000] = { 0 };
int abs(int n) {
	if (n < 0) {
		return 0 - n;
	}
	return n;
}
int main() {	
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m >> k;
	int a, b;
	for (int i = 0; i < k; i++) {
		cin >> a >> b;	
		if (A[a][b] == 0) {
			A[a][b] = 1;
			B[a][b]++;
			cout << a << " " << b << endl;
		}
		else {
			int minlen = B[a][b];//最短曼哈顿距离
			int flag = 0;
			while(flag==0){
				int hang;
				if (a - minlen <= 0) {//超出数组上边界
					hang = 1;
				}
				else {
					hang = a - minlen;
				}
				for (int j = hang; j <= a; j++) {//上面
					int zlie, ylie;
					int leftlen = minlen - abs(a - j);
					zlie = b - leftlen;
					ylie = b + leftlen;
					if (zlie >= 1 && A[j][zlie] == 0) {
						cout << j << " " << zlie << endl;
						A[j][zlie] = 1;
						flag = 1;
						B[a][b] = minlen;
						break;
					}
					else if (ylie <= m && A[j][ylie] == 0) {
						cout << j << " " << ylie << endl;
						A[j][ylie] = 1;
						flag = 1;
						B[a][b] = minlen;
						break;
					}
				}
				if (flag == 1) {
					break;
				}
				if (a + minlen > n) {//超出数组下边界
					hang = n;
				}
				else {
					hang = a + minlen;
				}
				for (int j = a+1; j <= hang; j++) {//下面
					int zlie, ylie;
					int leftlen = minlen - abs(a - j);
					zlie = b - leftlen;
					ylie = b + leftlen;
					if (zlie >= 1 && A[j][zlie] == 0) {
						cout << j << " " << zlie << endl;
						A[j][zlie] = 1;
						flag = 1;
						B[a][b] = minlen;
						break;
					}
					else if (ylie <= m && A[j][ylie] == 0) {
						cout << j << " " << ylie << endl;
						A[j][ylie] = 1;
						flag = 1;
						B[a][b] = minlen;
						break;
					}
				}
				//没找到
				minlen++;
			}
		}
	}
	return 0;
}

4.接水问题

问题描述

学校里有一个水房,水房里一共装有m 个龙头可供同学们打开水,每个龙头每秒钟的 供水量相等,均为1。 现在有n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从1 到n 编号,i 号同学的接水量为wi。接水开始时,1 到m 号同学各占一个水龙头,并同时打 开水龙头接水。当其中某名同学j 完成其接水量要求wj 后,下一名排队等候接水的同学k 马上接替j 同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即 j 同学第x 秒结束时完成接水,则k 同学第x+1 秒立刻开始接水。若当前接水人数n’不足m, 则只有n’个龙头供水,其它m−n’个龙头关闭。 现在给出n 名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。

输入格式

第1 行2 个整数n 和m,用一个空格隔开,分别表示接水人数和龙头个数。 第2 行n 个整数w1、w2、……、wn,每两个整数之间用一个空格隔开,wi 表示i 号同 学的接水量。

输出格式

输出只有一行,1 个整数,表示接水所需的总时间。

样例输入

Sample Input1:
5 3
4 4 1 2 1

Sample Input2:
8 4
23 71 87 32 70 93 80 76

样例输出

Sample Output1:
4

Sample Output2:
163

输入输出样例1说明

第1 秒,3 人接水。第1 秒结束时,1、2、3 号同学每人的已接水量为1,3 号同学接完
水,4 号同学接替3 号同学开始接水。
第2 秒,3 人接水。第2 秒结束时,1、2 号同学每人的已接水量为2,4 号同学的已接
水量为1。
第3 秒,3 人接水。第3 秒结束时,1、2 号同学每人的已接水量为3,4 号同学的已接
水量为2。4 号同学接完水,5 号同学接替4 号同学开始接水。
第4 秒,3 人接水。第4 秒结束时,1、2 号同学每人的已接水量为4,5 号同学的已接
水量为1。1、2、5 号同学接完水,即所有人完成接水。
总接水时间为4 秒。

数据规模和约定

1 ≤ n ≤ 10000,1 ≤m≤ 100 且m≤ n;
1 ≤ wi ≤ 100。

示例代码

#include
using namespace std;
int n, m, k;
int finish(int b[100], int m) {
	for (int i = 0; i < m; i++) {
		if (b[i] > 0) {
			return 0;
		}
	}
	return 1;
}
int main() {	
	int n, m, t = 0, a[10000], b[100] = { 0 };
	cin >> n >> m;
	if (m > n) {
		m = n;
	}
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	int cnt = m;
	for (int i = 0; i < m; i++) {
		b[i] = a[i];
	}
	int time = 0;
	while (finish(b, m) == 0) {//只有还有水龙头在使用
		time++;
		for (int i = 0; i < m; i++) {
			b[i]--;
			if (b[i] == 0) {
				if (cnt < n ) {//如果还有人没打水
					b[i] = a[cnt++];
				}
			}
		}
	}
	cout << time;
	return 0;
}

你可能感兴趣的:(蓝桥杯,蓝桥杯,职场和发展)