输入包括多组测试数据。 每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目。 学生ID编号从1编到N。 第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩 接下来又M行,每一行有一个字符C(只取‘Q’或‘U’),和两个正整数A,B,当C为'Q'的时候, 表示这是一条询问操作,他询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少 当C为‘U’的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。
对于每一次询问操作,在一行里面输出最高成绩.
5 7 1 2 3 4 5 Q 1 5 U 3 6 Q 3 4 Q 4 5 U 4 5 U 2 9 Q 1 5
5 6 5 9
#include <iostream> #include <cstdlib> #include <vector> using namespace std; int maxScore(const vector<int> scores, int beg, int end) { if (beg > end) { int tmp = beg; beg = end; end = tmp; }//if if (scores.empty() || beg > end || end >= scores.size()) return -1; int ret = scores[beg]; for (int i = beg + 1; i <= end; ++i) { if (scores[i] > ret) ret = scores[i]; }//for return ret; } int main() { int N, M; while (cin >> N >> M) { vector<int> scores(N+1, 0); for (int i = 1; i <= N; ++i) { cin >> scores[i]; }//for char op='\0'; int A, B; for (int i = 0; i < M; ++i) { cin >> op >> A >> B; if( 'U' == op) { scores[A] = B; }//if else if ('Q' == op) { cout << maxScore(scores, A, B) << endl; }//else continue; }//for }//while //system("pause"); return 0; }
一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。 文件路径为windows格式 如:E:\V1R2\product\fpgadrive.c 1325
将所有的记录统计并将结果输出,格式:文件名代码行数数目,一个空格隔开,如: fpgadrive.c 1325 1 结果根据数目从多到少排序,数目相同的情况下,按照输入第一次出现顺序排序。 如果超过8条记录,则只输出前8条记录. 如果文件名的长度超过16个字符,则只输出后16个字符
E:\V1R2\product\fpgadrive.c 1325
fpgadrive.c 1325 1
#include <iostream> #include <cstdlib> #include <vector> #include <string> #include <unordered_set> #include <algorithm> using namespace std; struct Info{ string path; string name; int lineNo; int count; Info(string str, int n) :path(str), lineNo(n), name(""), count(0){} ~Info(){} }; bool cmp(Info *info1, Info *info2) { return info1->count > info2->count; } int main() { string path; int lineNo; vector<Info *> files; while (cin >> path >> lineNo) { string name = ""; int pos = path.find_last_of('\\'); if (pos > -1 && pos < path.size()) name = path.substr(pos + 1); bool isExist = false; for (unsigned int i = 0; i < files.size(); ++i) { if (files[i]->name == name && files[i]->lineNo == lineNo) { ++files[i]->count; isExist = true; break; }//if }//for if (!isExist) { Info *info = new Info(path, lineNo); info->name = name; info->count = 1; files.push_back(info); /*恢复判别flag*/ isExist = false; }//if }//while sort(files.begin(), files.end(), cmp); int len = files.size(); /*如果超过8条,只输出8条*/ if (len > 8) len = 8; for (int i = 0; i < len; ++i) { if (files[i]->name.size() > 16) files[i]->name = files[i]->name.substr(files[i]->name.size() - 16); cout << files[i]->name << " " << files[i]->lineNo << " " << files[i]->count << endl; }//for //system("pause"); return 0; }
输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如4 4 4 4-joker JOKER。
输出两手牌中较大的那手,不含连接符,扑克牌顺序不变,仍以空格隔开;如果不存在比较关系则输出ERROR。
4 4 4 4-joker JOKER
joker JOKER
#include <iostream> #include <cstdlib> #include <string> #include <vector> using namespace std; const string MAX1 = "joker JOKER"; const string MAX2 = "JOKER joker"; const string POKER = "345678910JQKA2jokerJOKER"; /*计算字符串中单词的个数*/ int count(const string str) { if (str.empty()) return 0; int ret = 1; string::size_type i = 0, k = 0; while ((k = str.find(' ',i)) != string::npos) { ++ret; i = k + 1; }//while return ret; } int main() { /*两个玩家*/ string strA, strB; string str; while (getline(cin, str)) { int pos = str.find_first_of('-'); strA = str.substr(0, pos); strB = str.substr(pos + 1); if (strA == MAX1 || strA == MAX2) { cout << strA << endl; continue; }//if if (strB == MAX1 || strB == MAX2) { cout << strB << endl; continue; }//if int lenA = count(strA), lenB = count(strB); if (lenA == lenB) { if (POKER.find(strA.substr(0, strA.find(' '))) > POKER.find(strB.substr(0, strB.find(' ')))) cout << strA << endl; else cout << strB << endl; } else{ if (lenA == 4 && lenB != 4) cout << strA << endl; else if (lenB == 4 && lenA != 4) cout << strB << endl; else cout << "ERROR" << endl; }//else }//while //system("pause"); return 0; }