(OJ90)字符串中找整数
问题描述
对于一个字符串,编程找出其中的所有整数。例如,字符串"a12bc34d05",其中有整数12、34、5。
输入说明
程序输入包括多行,每一行都是一串字符,字符串长度不超过500。字符串中的字符只有字母与数字。
输出说明
程序输出为多行,每行第一个数代表所对应的字符串中整数的总个数。紧跟其后的依次是每个整数,数和数之间有一个空格。行与行之间没有多余空行,行首行尾没有多余空格。
输入范例
a12bc034d5
12886668&78711
abcdefghijklmn
输出范例
3 12 34 5
2 12886668 78711
0
个人总结
从字符串中提取整数的方法前面题目涉及过。
代码
cpp
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
while(cin >> s){
int count = 0;
vector<int> result;
for(int i = 0; i < s.size();){
if(s[i] < '0' || s[i] > '9'){
i++;
continue;
}
int num = 0;
while(s[i] >= '0' && s[i] <= '9' && i < s.size()){
num = num * 10 + (s[i] - '0');
i++;
}
if(num != 0){
result.push_back(num);
count++;
}
}
cout << count;
for(int i = 0; i < result.size(); i++){
cout << " " << result[i];
}
cout << endl;
}
return 0;
}
(OJ91)乒乓球
问题描述
国际乒联主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。明明就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响。在开展他的研究之前,明明首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。 (注:11(21)分制,在一局比赛中,选手A先得到11(21)分且此时领先选手B 2分或2分以上时,则选手A赢得此局;若当双方打成10(20)平后,则先多得2分的一方为胜方,赢得此局。)
明明通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果(截至记录末尾)。一局比赛的开始比分为0比0。 比如现在有这么一份记录,(其中W表示明明获得一分,L表示明明的对手获得一分):
WWWWWWWWWWWWWWWWWWWWWWLW
在11分制下,此时比赛的结果是明明第一局11比0获胜,第二局11比0获胜,正在进行第三局,当前比分1比1。
在21分制下,此时比赛结果是明明第一局21比0获胜,正在进行第二局,当前比分2比1。
再如有这么一份记录,(其中W表示明明获得一分,L表示明明的对手获得一分):
WLWLWLWLWLWLWLWLWLWLWLWLWL
在11分制下,此时比赛的结果是明明和对手打成13比13,这局比赛仍没有分出胜负,因为任何一方都没有领先其对手2分。
在21分制下,此时比赛的结果是明明和对手打成13比13,这局比赛仍在进行中。
由于明明参加过多年的比赛,比赛的数据量相当庞大,如果仅仅使用手工统计,在短时间内统计出结果对于明明来说是相当困难的。因此明明求助于你,希望你能写一个程序,帮助他快速地统计出结果来。
明明的问题可以归结为:给你一系列的比赛数据(WL形式),分别按照11分制和21分制的比赛规则进行统计,然后输出统计结果。
输入说明
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每行包括一串有W、L和E组成比赛结果,其中W表示明明得一分,L表示明明的对手得一分,E表示该组测试数据的结束,也就是说E后面的W、L应该忽略,无需处理。每行的长度不会超过30个字符。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将每组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。
每组运算结果由两部分组成,其中第一部分是11分制下的结果,第二部分是21分制下的结果,两部分之间由一个空行分隔。
每部分由若干行组成,每一行对应一局比赛的比分(按比赛信息输入顺序),每局的比分按如下形式表示:m:n,其中m表示明明的得分,n表示明明的对手的得分,m、n之间用一个冒号隔开。
输出时,每组运算结果与其后一组运算结果之间有一个空行,第一组运算结果前面以及最后一组运算结果后面没有任何空行或其他任何字符。 注:通常,显示屏为标准输出设备。
输入范例
WWWWWWWWWWLLLLLLLLLLL
WWWWWWWWWLLLLLLLLLE
LLLLLLLLLLLLLLLLLE
输出范例
13:11
6:9
19:20
0:11
0:6
0:17
个人总结
1.g11与g22分别用来存放在11分制与21分制下每一局的最终比分,game11与game21用来判定当前比分符不符合胜利条件(即:这一局结束条件)。
2.难点在于划定一局结束与一组输入结束,出现E代表一组输入结束,game11(21)为true代表一局结束。
3.若一局结束,则存储这一局的比分,将A与B的比分重置为0,若一组输入结束(检测到E),则存储当前比分(这里是易错点),并将A与B的比分重置为0,一组输入结束后统一输出历史比分记录,并将比分记录表(g11,g21)清空(易错)。
代码
cpp
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
int A11 = 0, B11 = 0;
int A21 = 0, B21 = 0;
vector<vector<int>> g11;
vector<vector<int>> g21;
bool flag = false;
while(cin >> s){
int i = 0;
while(i < s.size()){
if(s[i] == 'W'){
i++;
A11++;
A21++;
}else if(s[i] == 'L'){
i++;
B11++;
B21++;
}else{
i++;
flag = true;
}
bool game11 = ((A11 == 11 || B11 == 11) && abs(A11 - B11) >= 2) || (A11 >= 10 && B11 >= 10 && abs(A11 - B11) >= 2);
if(game11){
g11.push_back({A11, B11});
A11 = 0;
B11 = 0;
}
bool game21 = ((A21 == 21 || B21 == 21) && abs(A21 - B21) >= 2) || (A21 >= 20 && B21 >= 20 && abs(A21 - B21) >= 2);
if(game21){
g21.push_back({A21, B21});
A21 = 0;
B21 = 0;
}
if(flag){
if(A11 != 0 || B11 != 0){
g11.push_back({A11, B11});
}
if(A21 != 0 || B21 != 0){
g21.push_back({A21, B21});
}
A11 = 0;
B11 = 0;
A21 = 0;
B21 = 0;
break;
}
}
if(flag){
for(int i = 0; i < g11.size(); i++){
for(int j = 0; j < 2; j++){
cout << (j == 0 ? "" : ":") << g11[i][j];
}
cout << endl;
}
cout << endl;
for(int i = 0; i < g21.size(); i++){
for(int j = 0; j < 2; j++){
cout << (j == 0 ? "" : ":") << g21[i][j];
}
cout << endl;
}
cout << endl;
g11.clear();
g21.clear();
flag = false;
}
}
return 0;
}
(OJ92)字符串统计
问题描述
明明最近在做一个有关字符串的统计工作。两个由小写字母组成的字符串s1和s2,明明需要统计出以下四种关系:
(1)在s1或s2中存在的字母(包括在s1和s2中都存在的字母);
(2)在s1中且在s2中的字母;
(3)在s1中但不在s2中的字母,在s2中但不在s1中的字母;
(4)不在s1中且也不在s2中的字母;
例如两个字符串s1为"lkjsvoahs",s2为"qglhskjdfg":
(1)在s1或者在s2或者s1、s2中都存在的字母:adfghjkloqsv;
(2)在s1中且在s2中的字母:hjkls;
(3)在s1中但不在s2中的字母,在s2中但不在s1中的字母:adfgoqv;
(4)不在s1中且也不在s2中的字母:bceimnprtuwxyz;
明明统计了很久,但是由于统计过程十分繁琐,且很容易出错,导致明明的进度非常慢,很有可能因为统计不完而错过了晚上的约会。因此明明想请你帮个忙,帮他写一个程序,用程序来统计出以上几项内容。
明明的问题可以归结为:
输入两串由小写字母组成的字符串s1和s2,比较其中的字母,输出以下四项,输出的字母以字典顺序排列:
(1)在s1或s2中存在的字母(包括在s1和s2中都存在的字母);
(2)在s1中且在s2中的字母;
(3)在s1中但不在s2中的字母,在s2中但不在s1中的字母;
(4)不在s1中且也不在s2中的字母;
例如字符串s1为sadf,s2为asdf,则需输出以下四行(注意输出的格式):
in s1 or s2:adfs
in s1 and s2:adfs
in s1 but not in s2 ,or in s2 but not in s1:
not in s1 and s2:bceghijklmnopqrtuvwxyz
输入说明
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据两行,每组测试数据的第一行为字符串s1,每组测试数据的第二行为字符串s2;s1和s2都由小写英文字母组成,且长度不超过26个字符。测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。
每组运算结果由四行组成:
第一行为在s1或者在s2或者s1、s2中都存在的字母;
第二行为在s1中且在s2中的字母;
第三行为在s1中但不在s2中的字母,在s2中但不在s1中的字母;
第四行为不在s1中且也不在s2中的字母;
具体格式请参考样例输出。
每组运算结果其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果后面没有空行。
注:通常,显示屏为标准输出设备。
输入范例
sadf
asdf
lkjsvoahs
qglhskjdfg
输出范例
in s1 or s2:adfs
in s1 and s2:adfs
in s1 but not in s2 ,or in s2 but not in s1:
not in s1 and s2:bceghijklmnopqrtuvwxyz
in s1 or s2:adfghjkloqsv
in s1 and s2:hjkls
in s1 but not in s2 ,or in s2 but not in s1:adfgoqv
not in s1 and s2:bceimnprtuwxyz
个人总结
注意在s1中但不在s2中的字母,在s2中但不在s1中的字母的判定条件不是case3[i] == false,而是(case1[i] && !case2[i]) || (!case1[i] && case2[i])。
代码
cpp
#include <bits/stdc++.h>
using namespace std;
int main(){
string a;
string b;
while(cin >> a >> b){
bool case1[26] = {false};
bool case2[26] = {false};
bool case3[26] = {false};
bool case4[26] = {false};
for(int i = 0; i < a.size(); i++){
case1[a[i] - 'a'] = true;
}
for(int i = 0; i < b.size(); i++){
case2[b[i] - 'a'] = true;
}
for(int i = 0; i < 26; i++){
case3[i] = case1[i] && case2[i];
}
for(int i = 0; i < 26; i++){
case4[i] = case1[i] || case2[i];
}
cout << "in s1 or s2:";
for(int i = 0; i < 26; i++){
if(case4[i] == true){
cout << char(i + 'a');
}
}
cout << endl;
cout << "in s1 and s2:";
for(int i = 0; i < 26; i++){
if(case3[i] == true){
cout << char(i + 'a');
}
}
cout << endl;
cout << "in s1 but not in s2 ,or in s2 but not in s1:";
for(int i = 0; i < 26; i++){
if((case1[i] && !case2[i]) || (!case1[i] && case2[i])){
cout << char(i + 'a');
}
}
cout << endl;
cout << "not in s1 and s2:";
for(int i = 0; i < 26; i++){
if(case4[i] == false){
cout << char(i + 'a');
}
}
cout << endl << endl;
}
return 0;
}
英语翻译
供应链管理是企业用来确保其供应链高效且具有成本效益的一种过程。物联网系统可以为供应链管理提供支持,其核心理念是对一个由多个相关企业或合作伙伴组成的整体网络进行管理,这些参与方共同完成产品的制造、交付以及面向终端客户的服务。在任何时刻,市场力量都可能促使供应商、物流服务提供商、各类地点和客户以及供应链中的众多专业参与者发生变化。这种变化会对供应链基础设施产生重要影响,从建立贸易伙伴之间电子通信的基础层面,到生产流程配置和工作流程安排等更为复杂的层面,而这些都是实现快速生产所必不可少的。
物联网的一个关键应用是推动智能电网的发展。美国各地的电力公司已经或正在升级其电力管理和配电系统。安装在家庭中的各种传感器(如智能恒温器)可以收集信息,并通过网络将数据发送到主控站(甚至是本地"枢纽"),主控站能够进行复杂的电力管理,并向电网发送控制信号以实现节能。智能电网的实现依赖于将感知、测量和控制设备应用于电力的生产、输电、配电以及消费等各个环节。
物联网已被建议应用于住宅、商业、工业以及政府领域的智能建筑建设中。智能建筑可以是购物中心或住宅、医院或高层办公楼。智能建筑需要对供暖、空调、照明以及环境变化进行监测与调节,同时还可以管理建筑安防、消防系统和电梯运行等。智能建筑技术的核心在于为建筑引入更加精细化的监测与感知能力,从而提升其整体的"感知意识"。
英语单词
