DHU上机打卡D28

1.菱形输出

明明这次又碰到问题了:

给定一个正整数N,明明的爸爸让他输出一个以Z开始的菱形,以后依次为Y,X...,

比如当N等于1的时候输出图形:

Z

当N等于2的时候,输出图形:(Y前没有空格,Z、X和W前一个空格)

Z

Y X

W

当N等于3的时候,输出图形(Z前两个空格,Y、X前一个空格,W前没有空格......):

Z

Y X

W V

U T

S

明明发现当N很大的时候就不是很容易了,所以找到了你,希望你编写一个程序帮助他

明明的问题可以归结为:输入一个正整数N,输出一个以Z开始的菱形,以后依次为Y,X...。

请尝试定义函数,该函数的功能是输出以上图形的一行。

个人总结:

1.该图像要分上下两部分,上半部分每行的前置空格数从 N-1 递减到 0;下半部分每行的前置空格数从 1 递增到 N-1。

#include <iostream>

#include <string>

using namespace std;

void printDiamondLine(int lineType, int idx, int N, char& currentChar) {

int preSpace;

int charPos2;

if (lineType == 0) {

preSpace = N - 1 - idx;

charPos2 = 2 * idx;

} else {

preSpace = 1 + idx;

charPos2 = 2 * (N - 2 - idx);

}

for (int i = 0; i < preSpace; i++) {

cout << " ";

}

char firstChar = currentChar;

cout << firstChar;

currentChar--;

if (charPos2 > 0) {

for (int i = 0; i < charPos2 - 1; i++) {

cout << " ";

}

cout << currentChar;

currentChar--;

}

cout << endl;

}

void printDiamond(int N) {

char currentChar = 'Z';

for (int i = 0; i < N; i++) {

printDiamondLine(0, i, N, currentChar);

}

for (int i = 0; i < N - 1; i++) {

printDiamondLine(1, i, N, currentChar);

}

}

int main() {

int n;

int count = 0;

while (cin >> n) {

if (count > 0) {

cout << endl;

}

printDiamond(n);

count++;

}

return 0;

}

2.饲料调配

农夫约翰从来只用调配得最好的饲料来为他的奶牛。

饲料用三种原料调配成:大麦,燕麦和小麦。他知道自己的饲料精确的配比,在市场上是买不到这样的饲料的。他只好购买其他三种混合饲料(同样都由三种麦子组成),然后将它们混合,来调配他的完美饲料。

给出三组整数,表示 大麦:燕麦:小麦 的比例,找出用这三种饲料调配 x:y:z 的饲料的方法。

例如,给出目标饲料 3:4:5 和三种饲料的比例:

1:2:3

3:7:1

2:1:2

你必须编程找出使这三种饲料用量最少的方案,要是不能用这三种饲料调配目标饲料,输出'NONE'。'用量最少'意味着三种饲料的用量(整数)的和必须最小。

对于上面的例子,你可以用8份饲料1,2份饲料2,和5份饲料3,来得到7份目标饲料: 8*(1:2:3) + 1*(3:7:1) + 5*(2:1:2) = (21:28:35) = 7*(3:4:5)

以上数字中,表示饲料比例的整数都是小于100(数量级)的非负整数,表示各种饲料的份数的整数都小于100。一种混合物的比例不会由其他混合物的比例直接相加得到。

个人总结:

1.根据题意转换为等式:(a*a1 + b*b1 + c*c1)/x = (a*a2 + b*b2 + c*c2)/y = (a*a3 + b*b3 + c*c3)/z = k,a,b,c三数大于0小于100,但是提交后发现有一个没有AC等过几天再思考一下。

#include <iostream>

#include <climits>

using namespace std;

int checkRatio(int a, int b, int c,

int tx, int ty, int tz,

int f1x, int f1y, int f1z,

int f2x, int f2y, int f2z,

int f3x, int f3y, int f3z)

{

long long totalX = (long long)a*f1x + b*f2x + c*f3x;

long long totalY = (long long)a*f1y + b*f2y + c*f3y;

long long totalZ = (long long)a*f1z + b*f2z + c*f3z;

if (totalX == 0 && totalY == 0 && totalZ == 0) {

return -1;

}

if (tx != 0 && ty != 0 && tz != 0) {

if (totalX * ty != totalY * tx) return -1;

if (totalY * tz != totalZ * ty) return -1;

int k = -1;

if (tx != 0 && totalX != 0) {

k = totalX / tx;

} else if (ty != 0 && totalY != 0) {

k = totalY / ty;

} else if (tz != 0 && totalZ != 0) {

k = totalZ / tz;

}

if (k * tx == totalX && k * ty == totalY && k * tz == totalZ) {

return k;

}

}

return -1;

}

int main() {

int tx, ty, tz;

cin >> tx >> ty >> tz;

int f1x, f1y, f1z;

cin >> f1x >> f1y >> f1z;

int f2x, f2y, f2z;

cin >> f2x >> f2y >> f2z;

int f3x, f3y, f3z;

cin >> f3x >> f3y >> f3z;

int bestA = -1, bestB = -1, bestC = -1, bestK = -1;

int minSum = INT_MAX;

for (int a = 0; a < 100; a++) {

for (int b = 0; b < 100; b++) {

for (int c = 0; c < 100; c++) {

if (a == 0 && b == 0 && c == 0) {

continue;

}

int k = checkRatio(a, b, c, tx, ty, tz,

f1x, f1y, f1z, f2x, f2y, f2z, f3x, f3y, f3z);

if (k > 0) {

int currentSum = a + b + c;

if (currentSum < minSum) {

minSum = currentSum;

bestA = a;

bestB = b;

bestC = c;

bestK = k;

}

}

}

}

}

if (bestA != -1) {

cout << bestA << " " << bestB << " " << bestC << " " << bestK << endl;

} else {

cout << "NONE" << endl;

}

return 0;

}

3.最长的单词

明明刚开始学习英语的时候,对英语有浓厚的兴趣,但是随着时间的推移,英语单词量的增加,明明越来越觉得背单词是一件相当痛苦的事情。于是他想出各种各样的方法来增加背单词的乐趣。

这次他想出的方法是把所有要背的英语单词排成一行,找出其中最长的一个单词来先背,然后划去这个单词,在剩下的单词中再找出一个最长的单词来背,以此类推,直到把所有单词都背完。如果有多个长度相同的单词,则先背一行中靠前的那个单词。这样做的好处是:背到越后面,单词越短,越容易背,越能增加背单词的信心。

例如有这么一行单词: one two three four five 明明会首先挑出three来背,因为它是最长的一个单词,由5个字母组成;然后明明会选择four这个单词,虽然five这个单词的长度和four这个单词的长度一样,但是four在five的前面,所以明明会先背four这个单词,然后再背five,等明明把five这个单词背完以后,接着背one这个单词,最后背的是two这个单词。

但是在这样背单词之中,明明又发现了另一个问题,当要背非常多的单词时,寻找最长的单词会花很多时间,他想让你帮助他写一个程序,找出一行单词中最长的那个,节约明明背单词所花的时间,与此同时,明明希望你能告诉他这个英文单词有多少个字母组成,那他可以做到心里有数。

明明的问题可以归结为:在一行英文单词中,找出其中最长的单词(若有多个最长,找出第一个出现的),并输出这个单词的长度。

个人总结:

1.遍历输入的字符串,跳过空格,逐个提取完整的单词(处理多个空格的情况);getline(cin, line) 读取一整行,包括所有空格。

#include <iostream>

#include <string>

using namespace std;

int main() {

string line;

while (getline(cin, line)) {

string currentWord = "";

string longestWord = "";

int maxLength = 0;

for (char c : line) {

if (c == ' ') {

if (!currentWord.empty()) {

int currLen = currentWord.length();

if (currLen > maxLength) {

maxLength = currLen;

longestWord = currentWord;

}

currentWord = "";

}

continue;

}

currentWord += c;

}

if (!currentWord.empty()) {

int currLen = currentWord.length();

if (currLen > maxLength) {

maxLength = currLen;

longestWord = currentWord;

}

}

cout << maxLength << " " << longestWord << endl;

}

return 0;

}

翻译:

计算机科学的目标涵盖了从探索如何更有效地教导人们使用现有计算机,到对那些可能在未来数十年内都无法实现的技术和方法进行高度推测性研究等多个方面。而所有这些具体目标的底层动机是希望通过更有效地利用计算机来改善人类当下以及未来的信息使用状况。

3.理论与实验

计算机科学是理论、工程和实验的综合体现。在某些情况下,计算机科学家会先提出一个理论,然后工程师们基于该理论将计算机硬件和软件进行组合,并对其进行实验测试。这种基于理论的方法的一个例子是开发新的软件工程工具,然后在实际使用中对其进行评估。在其他情况下,实验可能会产生新的理论,例如发现人工神经网络的行为类似于大脑中的神经元,从而在神经生理学领域产生新的理论。

或许人们会觉得计算机的可预测性使得实验变得不再必要,因为实验的结果本应事先就能知晓。但当计算机系统及其与自然界的相互作用变得足够复杂时,就可能会出现意想不到的行为。因此,实验和传统的科学方法在计算机科学中是至关重要的组成部分。

相关推荐
adore.9681 小时前
2.21 oj基础89 90 91+U12B部分
开发语言·c++
feng_you_ying_li1 小时前
data类的实现
c++
谁不学习揍谁!1 小时前
基于python大数据机器学习旅游数据分析可视化推荐系统(完整系统+开发文档+部署教程+文档等资料)
大数据·python·算法·机器学习·数据分析·旅游·数据可视化
楼田莉子1 小时前
CMake学习:CMake在二进制工程场景上应用
linux·c++·vscode·学习·软件构建
programhelp_1 小时前
Snowflake OA 2026真题解析|3道Hard Coding全拆解,附DP+双指针实战思路
算法
专注VB编程开发20年1 小时前
C#,VB.NET GPU计算和调试
算法·gpu
专注VB编程开发20年1 小时前
C#,VB.NET如何用GPU进行大量计算,提高效率?
开发语言·c#·.net
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧1 小时前
Jsoup: 一款Java的HTML解析器
java·开发语言·前端·后端·缓存·html
Protein_zmm1 小时前
【算法基础】位运算、离散化、区间合并
java·算法·spring