#include
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
string num = to_string(a + b);
string ans = "";
for (int i = num.size() - 1, j = 0; i >= 0; i -- )
{
ans = num[i] + ans;
++ j;
if (j % 3 == 0 && i && num[i - 1] != '-') ans = "," + ans;
}
cout << ans;
return 0;
}
#include
using namespace std;
string word[] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
int main()
{
string n;
cin >> n;
int s = 0;
for (auto c : n) s += c - '0';
string str = to_string(s);
cout << word[str[0] - '0'];
for (int i = 1; i < str.size(); i ++ ) cout << ' ' << word[str[i] - '0'];
return 0;
}
#include
using namespace std;
int main()
{
string open_id, open_time;
string close_id, close_time;
int m;
cin >> m;
for (int i = 0; i < m; i ++ )
{
string id, in_time, out_time;
cin >> id >> in_time >> out_time;
// 更新
if (!i || in_time < open_time)
{
open_id = id;
open_time = in_time;
}
if (!i || out_time > close_time)
{
close_id = id;
close_time = out_time;
}
}
cout << open_id << ' ' << close_id;
return 0;
}
题意 :
思路 :
i - 1
时刻,% 1440表示在一个周期中是第几分钟,/ 60表示这是第几个小时sum[i]
表示 00 : 00 − 00 : 01 , 00 : 01 − 00 : 02 , . . . , − 00 : i 00:00-00:01,00:01-00:02,...,-00:i 00:00−00:01,00:01−00:02,...,−00:i,所以利用前缀和时不用-1语法 :
sprintf
.c_str
,可以返回这个string的char数组的指针
#include
#include
#include
#include
#include
using namespace std;
#define pb push_back
#define fi first
#define se second
const int N = 1010, M = 1440 * 31 + 10;
int cost[24];
double sum[M];
struct Record
{
int minutes;
string state;
string format_time;
bool operator<(const Record &t) const
{
return minutes < t.minutes;
}
};
map<string, vector<Record>> persons;
int main()
{
for (int i = 0; i < 24; i ++ ) cin >> cost[i];
for (int i = 1; i < M; i ++ ) sum[i] = sum[i - 1] + cost[(i - 1) % 1440 / 60] / 100.0;
int n; cin >> n;
// string name, state, format_time;
char name[25], state[10], format_time[20];
int month, day, hour, minute;
for (int i = 0; i < n; i ++ )
{
scanf("%s %d:%d:%d:%d %s", name, &month, &day, &hour, &minute, state);
int minutes = (day - 1) * 1440 + hour * 60 + minute;
sprintf(format_time, "%02d:%02d:%02d", day, hour, minute);
persons[name].pb({minutes, state, format_time});
}
for (auto &person : persons)
{
auto name = person.fi;
auto records = person.se;
sort(records.begin(), records.end());
double total = 0;
for (int i = 0; i + 1 < records.size(); i ++ )
{
auto a = records[i], b = records[i + 1];
if (a.state == "on-line" && b.state == "off-line")
{
if (!total) printf("%s %02d\n", name.c_str(), month);
cout << a.format_time << ' ' << b.format_time << ' ';
double c = sum[b.minutes] - sum[a.minutes];
printf("%d $%.2lf\n", b.minutes - a.minutes, c);
total += c;
}
}
if (total) printf("Total amount: $%.2lf\n", total);
}
}
题意 :
思路 :
做法 :
语法 :
#include
#include
#include
using namespace std;
const int N = 1e4 + 10;
int n, m;
struct Person
{
int arrive_time;
int service_time;
bool operator< (const Person &t) const
{
return arrive_time < t.arrive_time;
}
}persons[N];
int main()
{
scanf("%d%d", &n, &m);
int hour, minute, second, service_time, arrive_time;
for (int i = 0; i < n; i ++ )
{
scanf("%d:%d:%d %d", &hour, &minute, &second, &service_time);
service_time = min(service_time, 60);
arrive_time = hour * 3600 + minute * 60 + second;
persons[i] = {arrive_time, service_time * 60};
}
sort(persons, persons + n);
priority_queue<int, vector<int>, greater<int>> windows;
for (int i = 0; i < m; i ++ ) windows.push(8 * 3600);
int sum = 0, cnt = 0;
for (int i = 0; i < n; i ++ )
{
auto person = persons[i];
int w = windows.top();
windows.pop();
if (person.arrive_time > 17 * 3600) break;
int start_time = max(w, person.arrive_time);
sum += start_time - person.arrive_time;
cnt ++ ;
int end_time = start_time + person.service_time;
windows.push(end_time);
}
printf("%.1lf\n", (double)sum / cnt / 60);
}
思路 :
#include
using namespace std;
const int N = 1010;
string name[N], pwd[N];
string change(string str)
{
string res;
for (auto c : str)
if (c == '1') res += '@';
else if (c == '0') res += '%';
else if (c == 'l') res += 'L';
else if (c == 'O') res += 'o';
else res += c;
return res;
}
int main()
{
int n;
cin >> n;
int m = 0;
for (int i = 0; i < n; i ++ )
{
string a, b;
cin >> a >> b;
string c = change(b);
if (b != c) name[m] = a, pwd[m ++ ] = c;
}
if (!m)
{
if (n == 1) puts("There is 1 account and no account is modified");
else printf("There are %d accounts and no account is modified", n);
}
else
{
cout << m << endl;
for (int i = 0; i < m; i ++ ) cout << name[i] << ' ' << pwd[i] << endl;
}
return 0;
}
题意 :
思路 :
语法 :
string.empty()
表示这个字符串还没有被赋值过string.size()
#include
using namespace std;
int main()
{
int n; cin >> n;
string boy_name, boy_id;
int boy_score;
string girl_name, girl_id;
int girl_score;
string name, id, sex;
int score;
for (int i = 0; i < n; i ++ )
{
cin >> name >> sex >> id >> score;
if (sex == "F")
{
if (girl_name.empty() || score > girl_score)
{
girl_score = score;
girl_name = name;
girl_id = id;
}
}
else
{
if (boy_name.empty() || score < boy_score)
{
boy_score = score;
boy_name = name;
boy_id = id;
}
}
}
if (girl_name.empty()) puts("Absent");
else cout << girl_name << ' ' << girl_id << endl;
if (boy_name.empty()) puts("Absent");
else cout << boy_name << ' ' << boy_id << endl;
if (boy_name.empty() || girl_name.empty()) puts("NA");
else cout << girl_score - boy_score << endl;
}
#include
#include
using namespace std;
int main()
{
string s1, s2;
getline(cin, s1);
getline(cin, s2);
unordered_set<char> hash;
for (auto c : s2) hash.insert(c);
string res;
for (auto c : s1)
if (!hash.count(c))
res += c;
cout << res;
return 0;
}
题意 :
思路 :
d[1]>0 unless the number is 0
,意思是除了0需要特殊处理,否则删去前导零语法 :
#include
using namespace std;
string change(string a, int n)
{
int k = a.find('.');
if (k == -1) a += '.', k = a.find('.');
string s = a.substr(0, k) + a.substr(k + 1);
while (s.size() && s[0] == '0') s = s.substr(1), k -- ;
if (s.empty()) k = 0;
if (s.size() > n) s = s.substr(0, n);
else s += string(n - s.size(), '0');
return "0." + s + "*10^" + to_string(k);
}
int main()
{
int n;
string a, b;
cin >> n >> a >> b;
a = change(a, n);
b = change(b, n);
if (a == b) cout << "YES " << a;
else cout << "NO " << a << ' ' << b;
}
#include
using namespace std;
int main()
{
string a, b, c, d;
cin >> a >> b >> c >> d;
int k = 0;
while (true)
{
if (a[k] == b[k] && 'A' <= a[k] && 'G' >= a[k]) break;
k ++ ;
}
char weekdays[7][4] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};
printf("%s ", weekdays[a[k] - 'A']);
k ++ ;
while (true)
{
if (a[k] == b[k] && (a[k] >= '0' && a[k] <= '9' || a[k] >= 'A' && a[k] <= 'N')) break;
k ++ ;
}
printf("%02d:", a[k] <= '9' ? a[k] - '0' : a[k] - 'A' + 10);
for (int i = 0;; i ++ )
if (c[i] == d[i] && (c[i] >= 'a' && c[i] <= 'z' || c[i] >= 'A' && c[i] <= 'Z'))
{
printf("%02d", i);
break;
}
return 0;
}
#include
using namespace std;
int main()
{
string s;
cin >> s;
if (s[0] == '-') cout << '-';
int k = s.find('E');
string a = s[1] + s.substr(3, k - 3);
int b = stoi(s.substr(k + 1));
if (b <= 0) cout << "0." << string(- b - 1, '0');
else if (b < a.size() - 1) a = a.substr(0, b + 1) + '.' + a.substr(b + 1);
else a += string(b - a.size() + 1, '0');
cout << a;
return 0;
}
#include
using namespace std;
const int N = 110;
string s[N];
int main()
{
int n;
cin >> n;
getchar();
for (int i = 0; i < n; i ++ ) getline(cin, s[i]);
for (int k = s[0].size(); k; k -- )
{
string sf = s[0].substr(s[0].size() - k);
bool is_matched = true;
for (int i = 1; i < n; i ++ )
if (s[i].size() < k || s[i].substr(s[i].size() - k) != sf)
{
is_matched = false;
break;
}
if (is_matched)
{
cout << sf;
return 0;
}
}
cout << "nai";
return 0;
}
题意 :
#include
using namespace std;
int main()
{
string a, b;
cin >> a >> b;
bool st[200] = {0};
b += '#';
for (int i = 0, j = 0; i < a.size(); i ++ )
{
char x = toupper(a[i]), y = toupper(b[j]);
if (x == y) j ++ ;
else
{
if (!st[x]) st[x] = true, cout << x;
}
}
return 0;
}
#include
using namespace std;
int main()
{
int n;
cin >> n;
double sum = 0;
int cnt = 0;
while (n -- )
{
string num;
cin >> num;
double x;
bool success = true;
try
{
size_t idx;
x = stof(num, &idx);
if (idx < num.size()) success = false;
}
catch(...)
{
success = false;
}
if (x < -1000 || x > 1000) success = false;
int k = num.find('.');
if (k != -1 && num.size() - k > 3) success = false;
if (success) cnt ++ , sum += x;
else printf("ERROR: %s is not a legal number\n", num.c_str());
}
if (cnt > 1) printf("The average of %d numbers is %.2lf", cnt, sum / cnt);
else if (cnt == 1) printf("The average of 1 number is %.2lf", sum);
else printf("The average of 0 numbers is Undefined");
return 0;
}
#include
#include
using namespace std;
const int N = 1e3 + 10;
string name[N];
int main()
{
int m, n, s;
cin >> m >> n >> s;
unordered_set<string> se;
for (int i = 1; i <= m; i ++ ) cin >> name[i];
int k = s;
while (k <= m)
{
if (se.find(name[k]) != se.end()) k ++ ;
else
{
cout << name[k] << endl;
se.insert(name[k]);
k += n;
}
}
if (se.empty()) cout << "Keep going...";
return 0;
}
语法 :
#include
#include
#include
#include
#include
using namespace std;
struct School
{
string name;
int cnt;
double sum;
School(): cnt(0), sum(0) {}
bool operator< (const School &t) const
{
if (sum != t.sum) return sum > t.sum;
if (cnt != t.cnt) return cnt < t.cnt;
return name < t.name;
}
};
int main()
{
int n;
cin >> n;
unordered_map<string, School> hash;
while (n -- )
{
string id, sch;
double grade;
cin >> id >> grade >> sch;
for (auto& c : sch) c = tolower(c);
if (id[0] == 'B') grade /= 1.5;
else if (id[0] == 'T') grade *= 1.5;
hash[sch].sum += grade;
hash[sch].cnt ++ ;
hash[sch].name = sch;
}
vector<School> schools;
for (auto item : hash)
{
item.second.sum = (int)(item.second.sum + 1e-8);
schools.push_back(item.second);
}
sort(schools.begin(), schools.end());
cout << schools.size() << endl;
int rank = 1;
for (int i = 0; i < schools.size(); i ++ )
{
auto s = schools[i];
if (i && s.sum != schools[i - 1].sum) rank = i + 1;
printf("%d %s %d %d\n", rank, s.name.c_str(), (int)s.sum, s.cnt);
}
return 0;
}
思路 :
输出按人数非递增顺序,格式为 考场编号 总人数。若人数并列则按考场编号递增顺序输出。
,因此for (auto item : hash) rooms.push_back({-item.second, item.first});
,因此可以直接sort(rooms.begin(), rooms.end());
,输出的时候printf("%s %d\n", room.second.c_str(), -room.first);
#include
#include
#include
#include
#include
using namespace std;
const int N = 10010;
int n, m;
struct Person
{
string id;
int grade;
bool operator< (const Person &t) const
{
if (grade != t.grade) return grade > t.grade;
return id < t.id;
}
}p[N];
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i ++ ) cin >> p[i].id >> p[i].grade;
for (int k = 1; k <= m; k ++ )
{
string t, c;
cin >> t >> c;
printf("Case %d: %s %s\n", k, t.c_str(), c.c_str());
if (t == "1")
{
vector<Person> persons;
for (int i = 0; i < n; i ++ )
if (p[i].id[0] == c[0])
persons.push_back(p[i]);
sort(persons.begin(), persons.end());
if (persons.empty()) puts("NA");
else
for (auto person : persons) printf("%s %d\n", person.id.c_str(), person.grade);
}
else if (t == "2")
{
int cnt = 0, sum = 0;
for (int i = 0; i < n; i ++ )
if (p[i].id.substr(1, 3) == c)
{
cnt ++ ;
sum += p[i].grade;
}
if (!cnt) puts("NA");
else printf("%d %d\n", cnt, sum);
}
else
{
unordered_map<string, int> hash;
for (int i = 0; i < n; i ++ )
if (p[i].id.substr(4, 6) == c)
hash[p[i].id.substr(1, 3)] ++ ;
vector<pair<int, string>> rooms;
for (auto item : hash) rooms.push_back({-item.second, item.first});
sort(rooms.begin(), rooms.end());
if (rooms.empty()) puts("NA");
else
for (auto room : rooms)
printf("%s %d\n", room.second.c_str(), -room.first);
}
}
return 0;
}