电子商务网站建设的意义宜兴网站建设
竞赛总览
CSDN 编程竞赛二十八期:比赛详情 (csdn.net)
本期竞赛的题目都很简单,但是非常考验读题和编码速度。这一次没有遇到bug,竞赛体验较好。
竞赛题解
题目1、小Q的鲜榨柠檬汁
团建活动是大家所想要的。小Q给大家准备了鲜橙汁。现在有n个朋友买回了k瓶饮料,每瓶有l毫升的饮料,同时还买回了c个柠檬,每个柠檬可以切成d片,p克盐。已知每个朋友需要nl毫升的饮料,一片柠檬,以及np克盐。小Q想知道每个朋友最少可以喝多少杯饮料。
#include <cstdio>int min (int a, int b) {if (a < b) return a;return b;
}int main () {int n, k, l, c, d, p, nl, np;scanf ("%d %d %d %d %d %d %d %d", &n, &k, &l, &c, &d, &p, &nl, &np);int result = k * l / nl / n;result = min (result, c * d / n);result = min (result, p / np / n);printf ("%d", result);return 0;
}
此题看起来很吓人,其实特别水。题目描述略有一点问题。小Q想知道每个朋友最少可以喝多少杯饮料,其实是要计算每个朋友最多能够喝到多少杯饮料,并且要平均分配,这里实际上是在表达一种期望。否则,如果按照其主观意愿,最少一定可以喝到零杯饮料。
首先需要计算出原材料能够配置饮料的份数。
水:k瓶,l毫升,每份饮料需要nl毫升水。一共可以配置k*l/nl份饮料。
柠檬:c个,每个切d片,每份饮料需要1片柠檬。一共可以配置c*d/1份饮料,即c*d份饮料。
盐:p克,每份饮料需要np克盐。一共可以配置p/np份饮料。
实际可以生产的饮料份数为三者中的最小值。
计算出总份数之后,将饮料平均分给所有人饮用,向下取整,即可得到最终答案。
题目2、三而竭
一鼓作气再而衰三而竭。小艺总是喜欢把任务分开做。小艺接到一个任务,任务的总任务量是n。第一天小艺能完成x份任务。第二天能完成x/k,第t天能完成x/(k^(t-1))。小艺想知道自己第一天至少完成多少才能完成最后的任务。
题目的输入为n和k。
直接以第一天能完成x份任务为基准,计算k天能完成的总任务量。
int calc (int x, int k) {int result = 0;while (x > 0) {result += x;x /= k;}return result;
}
如果这个总任务量达到n,说明能够完成任务。
当然,如果第一天直接完成n份任务,最终一定能够完成任务。
所以,答案在1到n之间。既要完成任务,又要使得x尽可能小,正确答案需要同时满足这两点。
题目3、隧道逃生
小海豚喜欢打游戏,现在它在操纵游戏人物小C逃脱废弃的隧道,逃生装置在小C的前方X米远的位置。但是游戏机只有两个按钮:前进和后退。按前进,小C会前进m米;按后退,小C会后退n米。小海豚必须设法把小C送到逃生装置上,方能逃离隧道,请你帮帮小海豚,告诉它至少要操作多少次,才能通关。
#include <cstdio>int main () {int x, m, n;scanf ("%d %d %d", &x, &m, &n);int pos = 0, t = 0;while (pos != x) {if (pos < x) pos = pos + m;else if (pos > x) pos = pos - n;else break;t++;}printf ("%d", t);return 0;
}
用一个变量记录当前角色所在位置。当前位置小于终点位置时,前进;当前位置大于终点位置时,后退。记录操作次数,暴力模拟即可。
题目4、收件邮箱
已知字符串str表示邮箱的不标准格式。其中”.”会被记录成”dot”,”@”记录成”at”。写一个程序将str转化成可用的邮箱格式。可用格式中,字符串除了开头结尾所有”dot”,都会被转换;”at”只会被转化一次,开头结尾的不转化。
#include <cstdio>
#include <iostream>
#include <string>int main () {std::string str;std::cin >> str;int pos;pos = str.find ("at", 1);str = str.substr (0, pos) + "@" + str.substr (pos + 2, str.length () - pos - 2);int start = 0, end = 0;if (str.substr (0, 2) == "at") {str = str.substr (2, str.length () - 2);start = 1;} else if (str.substr (0, 3) == "dot") {str = str.substr (3, str.length () - 3);start = 2;}if (str.substr (str.length () - 2, 2) == "at") {str = str.substr (0, str.length () - 2);end = 1;} else if (str.substr (str.length () - 3, 3) == "dot") {str = str.substr (0, str.length () - 3);end = 2;}pos = str.find ("dot");while (pos > -1) {str = str.substr (0, pos) + "." + str.substr (pos + 3, str.length () - pos - 3);pos = str.find ("dot");}if (start == 1) str = "at" + str; else if (start == 2) str = "dot" + str;if (end == 1) str += "at"; else if (end == 2) str += "dot";printf ("%s", str.c_str ());return 0;
}
解决此题需要四个步骤。
1、替换at符号。需要注意的是, 开头结尾的不转化,因此,忽略位置0,从位置1开始寻找at即可。
2、有三种可选的开头类型:at开头、dot开头、其它(结尾类型同理)。判断完成之后,去掉开头结尾的特殊符号。
3、替换dot符号。
4、恢复开头结尾的符号。