201903-1.小中大
笔记:先假设mid为float型,通过mid-(int)mid判断其是否是整数,若是则通过强制类型转换为int型。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, max, min;
float mid;
scanf("%d", &n);
vector<int> v(n);
for (int i = 0; i < n; i++)
scanf("%d", &v[i]);
if (n % 2 == 0)
mid = (v[n / 2 - 1] + v[n / 2]) / 2.0;
else
mid = v[n / 2];
max = v[0] >= v[n - 1] ? v[0] : v[n - 1];
min = v[0] <= v[n - 1] ? v[0] : v[n - 1];
if (mid - (int)mid == 0)
cout << max << " " << (int)mid << " " << min;
else
cout << max << " " << mid << " " << min;
return 0;
}
201903-2.二十四点
笔记:使用scanf()时注意&;
getline(cin,str)//读取一行string类型
gets(str)//读取一行,char[]类型
cin>>str//碰到空格即结束读取
更具体的参考 blog.csdn.net/qq_40679299…
#include <iostream>
#include <stack>
using namespace std;
int main() {
int n;
char str[7];
stack<int> num;
stack<char> sign;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
cin >> str;
while (!num.empty())num.pop();
while (!sign.empty())sign.pop();
for (int j = 0; j < 7; j++) {
if (str[j] >= '0'&&str[j] <= '9') {
num.push(str[j] - '0');
}
else if (str[j] == '+') {
sign.push('+');
}
else if (str[j] == '-') {
sign.push('+');
num.push((-1)*(str[j + 1] - '0'));
j++;
}
else if (str[j] == 'x') {
int ans = num.top();
num.pop();
num.push(ans*(str[j + 1] - '0'));
j++;
}
else {
int ans = num.top();
num.pop();
num.push(ans / (str[j + 1] - '0'));
j++;
}
}
while (!sign.empty()) {
int ans_1 = num.top();
num.pop();
int ans_2 = num.top();
num.pop();
num.push(ans_1 + ans_2);
sign.pop();
}
if (num.top() == 24)
cout << "Yes\n";
else
cout << "No\n";
}
return 0;
}
201903-3.损坏的RAID5
201903-4.消息传递接口
我的代码测试示例没问题,但是只得了20分,好像是超时的原因?先贴上我的代码供日后纠错,再贴上大佬正确的代码,学习自:blog.csdn.net/richenyunqi…
我的代码:
#include <iostream>
#include <queue>
using namespace std;
int main() {
int T, n;
scanf("%d%d%*c", &T, &n);
vector<queue<int>> process(n);
while (T--) {
string str;
queue<int> empty;
for (int i = 0; i < n; i++) {
swap(empty, process[i]);
getline(cin, str);
for (int j = 0, k; j < str.size(); j = k + 1) {
k = str.find(' ', j);
if (k == string::npos)
k = str.size();
if (str[j] == 'S')
process[i].push(stoi(str.substr(j + 1, k - j - 1)) + i * 10000);
else
process[i].push(-(stoi(str.substr(j + 1, k - j - 1)) * 10000 + i));
}
}
bool flag = true;
while (flag) {
flag = false;
for (int i = 0; i < n; i++) {
if (process[i].empty())
continue;
for (int j = 0; j < n; j++) {
if (process[j].empty())
continue;
if (process[i].front() == -process[j].front()) {
process[i].pop();
process[j].pop();
flag = true;
}
}
}
}
for (int i = 0; i < n; i++)
if (!process[i].empty())
flag = true;
flag ? cout << 1 << endl : cout << 0 << endl;
}
return 0;
}
大佬的代码:
#include <iostream>
#include <queue>
#include <list>
#include <unordered_set>
using namespace std;
int main() {
int T, n;
scanf("%d%d%*c", &T, &n);
while (T--) {
list<pair<queue<int>, int>>process;//first成员是一个队列,存储每个进程的所有指令;second成员存储上一条执行的指令,初始化为INT_MAX
unordered_set<int>commands;//存储每个进程正在执行的指令
string s;
for (int i = 0; i < n; ++i) {
process.push_back({ queue<int>(),INT_MAX });
getline(cin, s);
for (int j = 0, k; j < s.size(); j = k + 1) {//按空格键分割字符串,并用整数表示指令
k = s.find(' ', j);
if (k == string::npos)
k = s.size();
if (s[j] == 'S')
process.back().first.push(i * 10000 + stoi(s.substr(j + 1, k - j - 1)));
else
process.back().first.push(-(stoi(s.substr(j + 1, k - j - 1)) * 10000 + i));
}
}
for (bool f = true; !process.empty(); f = true) {//f标志是否所有进程指令都被堵塞
for (auto i = process.begin(); i != process.end(); ++i) {//遍历所有进程
if (commands.find(i->second) != commands.end())//上一次执行的指令被堵塞了
continue;//进程也被堵塞,其他指令无法执行
if ((i->first).empty()) {//所有指令均已执行完毕
i = process.erase(i);//将该进程删除
--i;
continue;
}
while (!(i->first).empty()) {//进程还有指令要执行
int t = (i->first).front();//从队首弹出一条指令
(i->first).pop();
auto j = commands.find(-t);//查找其它进程中是否有正在执行的对应的指令
if (j == commands.end()) {//没有对应的指令
commands.insert(t);//将该指令插入到commands中
i->second = t;//更新上一次执行的指令为当前指令
break;
}
else {//有对应的指令
commands.erase(j);//将对应的指令从commands中删除
f = false;//并不是所有进程都被堵塞
}
}
}
if (f)//遍历完所有进程后发现所有进程均被堵塞,说明发生死锁
break;
}
puts(process.empty() ? "0" : "1");//跳出循环时进程list为空,表示所有进程指令均执行完毕,则没有死锁
}
return 0;
}
201812-1.小明上学
#include <iostream>
#include <vector>
using namespace std;
int main() {
int r, y, g;//红灯,黄灯,绿灯
int n;//路口和道路数
int sum = 0;
scanf("%d%d%d%d", &r, &y, &g, &n);
vector<int> k(n), t(n);
for (int i = 0; i < n; i++) {
scanf("%d%d", &k[i], &t[i]);
switch (k[i]) {
case 0:
case 1:
sum += t[i];
break;
case 2:
sum += (t[i] + r);
break;
}
}
printf("%d", sum);
return 0;
}
201812-2.小明放学
笔记:题目给出的测试用例可能很大,需要long long型。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int r, y, g, tm;//红灯,黄灯,绿灯
int n;//路口和道路数
long long sum = 0;
scanf("%d%d%d%d", &r, &y, &g, &n);
vector<long long> k(n), t(n);
for (int i = 0; i < n; i++) {
scanf("%d%d", &k[i], &t[i]);
tm = sum % (r + y + g);
switch (k[i]) {
case 0:
sum += t[i];
break;
case 1:
if (t[i] > tm) {//红灯
t[i] -= tm;
sum += t[i];
}
else if (tm >= t[i] + g && tm <= t[i] + g + y) {//黄灯
t[i] = y + g + t[i] - tm;
sum += (t[i] + r);
}
else if (tm > t[i] + g + y) {//红灯
t[i] = t[i] + r + g + y - tm;
sum += t[i];
}
break;
case 2:
if (t[i] > tm) {//黄灯
t[i] -= tm;
sum += (t[i] + r);
}
else if (tm >= t[i] && tm < t[i] + r) {//红灯
t[i] = r + t[i] - tm;
sum += t[i];
}
else if (tm > t[i] + r + g) {//黄灯
t[i] = r + y + g + t[i] - tm;
sum += (t[i] + r);
}
break;
case 3:
if (tm >= t[i] && tm < t[i] + y) {//黄灯
t[i] = y + t[i] - tm;
sum += (t[i] + r);
}
else if (tm >= t[i] + y && tm < t[i] + y + r) {//红灯
t[i] = t[i] + y + r - tm;
sum += t[i];
}
}
}
printf("%lld", sum);
return 0;
}
201812-4.数据中心
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXV = 50005;
const int MAXE = 100005;
struct edge {
int u, v;
int cost;
}E[MAXE];
bool cmp(edge a, edge b) {
return a.cost < b.cost;
}
int father[MAXV];//并查集数组
int findFather(int x) {//并查集查询函数
int a = x;
while (x != father[x]) {
x = father[x];
}
//路径压缩
while (a != father[a]) {
int z = a;
a = father[a];
father[z] = x;
}
return x;
}
//kruskal 部分,返回最小生成树最长边,参数n为顶点个数,m为图的边数
int kruskal(int n, int m) {
//ans为所求解,Num_Edge为当前生成树的边数
int ans = 0, Num_Edge = 0;
for (int i = 1; i <= n; i++) {//顶点范围是[1,n]
father[i] = i;//并查集初始化
}
sort(E, E + m, cmp);//所有边按边权从小到大排序
for (int i = 0; i < m; i++) {//枚举所有边
int faU = findFather(E[i].u);//查询测试边两个端点所在集合的根结点
int faV = findFather(E[i].v);
if (faU != faV) {//如果不在一个集合中
father[faU] = faV;//合并集合(即把测试边加入最小生成树中)
ans = E[i].cost;//测试边为当前所求解
Num_Edge++;//当前生成树的边数加1
if (Num_Edge == n - 1)break;//边数等于顶点数减1时结束算法
}
}
if (Num_Edge != n - 1)return -1;//无法连通时返回-1
else return ans;
}
int main() {
int n, m, root;
scanf("%d%d%d", &n, &m, &root);
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &E[i].u, &E[i].v, &E[i].cost);//两个端点编号、边权
}
int ans = kruskal(n, m);//kruskal算法入口
printf("%d", ans);
return 0;
}
201809-1.卖菜
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> v(n), v2(n);
for (int i = 0; i < n; i++)
cin >> v[i];
for (int i = 0; i < n; i++) {
if (i == 0)
v2[0] = (v[0] + v[1]) / 2;
else if (i == n - 1)
v2[n - 1] = (v[n - 2] + v[n - 1]) / 2;
else
v2[i] = (v[i - 1] + v[i] + v[i + 1]) / 3;
}
for (int i : v2)
cout << i << " ";
return 0;
}
201809-2.买菜
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, ans = 0;
cin >> n;
vector<pair<int, int>> h(n), w(n);
for (int i = 0; i < n; i++)
cin >> h[i].first >> h[i].second;
for (int i = 0; i < n; i++)
cin >> w[i].first >> w[i].second;
for (pair<int, int> p1 : h)
for (pair<int, int> p2 : w)
if (p1.first <= p2.second&&p1.second >= p2.first)
ans += min(p1.second, p2.second) - max(p1.first, p2.first);
cout << ans;
return 0;
}
201803-1.跳一跳
#include <iostream>
using namespace std;
int main() {
int pre = -1, ans, sum = 0, sorce;
while (cin >> ans) {
if (ans == 0)
cout << sum;
else if (ans == 1) {
sorce = 1;
sum += sorce;
}
else if (ans == 2) {
if (pre == -1 || sorce == 1) {
sorce = 2;
sum += sorce;
}
else {
sorce += 2;
sum += sorce;
}
}
pre = sorce;
}
return 0;
}
201803-2.碰撞的小球
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, L, t;
cin >> n >> L >> t;
vector<pair<int, int>> ball(n + 1);//表示小球的位置和小球的方向的组合,其中1表示向右,-1表示向左
vector<int> loc(L + 1, 0);//记录坐标轴上各位置有无小球,0表示不存在小球,否则表示小球编号
for (int i = 1; i <= n; i++) {
cin >> ball[i].first;
ball[i].second = 1;
loc[ball[i].first] = i;
}
while (t--) {
for (int i = 1; i <= n; i++) {
loc[ball[i].first] = 0;//小球从当前位置移走
ball[i].first += ball[i].second;//小球到达目标位置
if (loc[ball[i].first] != 0) {//目标位置已存在小球,发生碰撞
ball[i].second *= -1;
ball[loc[ball[i].first]].second *= -1;
}
else if (ball[i].first == 0 || ball[i].first == L)//小球碰到墙壁修改方向
ball[i].second *= -1;
loc[ball[i].first] = i;//更新小球在坐标轴上的位置
}
}
for (int i = 1; i <= n; i++)
cout << ball[i].first << " ";
return 0;
}
201712-1.最小差值
笔记:利用里的sort()可以进行快速排序。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++)
cin >> v[i];
sort(v.begin(), v.end());
int ans = v[1] - v[0];
for (int i = 1; i < n - 1; i++)
if (v[i + 1] - v[i] < ans)
ans = v[i + 1] - v[i];
cout << ans;
return 0;
}
201712-2.游戏
#include <iostream>
#include <queue>
using namespace std;
int main() {
int n, k, curr = 1, child;//curr表示当前报哪位数,child表示小朋友编号
cin >> n >> k;
queue<int> q;
for (int i = 1; i <= n; i++)
q.push(i);
while (q.size() > 1) {
child = q.front();
q.pop();
if (curr%k != 0 && curr % 10 != k)
q.push(child);
curr++;
}
cout << q.front();
return 0;
}
201709-1.打酱油
笔记:注意2*n/5和(n/5)*2逻辑上的问题.
#include <iostream>
using namespace std;
int main() {
int N;
cin >> N;
int n = N / 10;//n表示不算赠送的瓶数
int ans_5 = (n / 5) * 2;//表示买五瓶赠送的瓶数
int res = n % 5;
int ans_3 = res / 3;//表示买三瓶赠送的瓶数
cout << n + ans_5 + ans_3;
return 0;
}
201709-2.公共钥匙盒
笔记:利用优先级队列(priority_queue),重载其<运算符使其符合题目要求。
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct Key {
int num;//钥匙编号
int time;//当前时间
bool borrow;//true表示借钥匙,false表示取钥匙
Key(int n, int t, bool b) :num(n), time(t), borrow(b) {}
bool operator < (const Key&k)const {
if (this->time != k.time)
return this->time > k.time;
else if (this->borrow != k.borrow)
return this->borrow && !k.borrow;
else
return this->num > k.num;
}
};
priority_queue<Key> pq;
int main() {
int N, K;
cin >> N >> K;
vector<int> key(N + 1);
for (int i = 1; i <= N; i++)
key[i] = i;
for (int i = 0; i < K; i++) {
int a, b, c;
cin >> a >> b >> c;
pq.push(Key(a, b, true));
pq.push(Key(a, b + c, false));
}
while (!pq.empty()) {
Key j = pq.top();
pq.pop();
if (j.borrow) {
int i = 1;
while (key[i] != j.num)
i++;
key[i] = -1;
}
else if (!j.borrow) {
int i = 1;
while (key[i] != -1)
i++;
key[i] = j.num;
}
}
for (int i = 1; i <= N; i++)
cout << key[i] << " ";
return 0;
}
201709-4.通信网络
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> Adj[1005];//图G的邻接表
int N, M;//n为顶点数
bool vis[1005];//如果顶点i已被访问,则vis[i]==true。初值为false
bool konw[1005][1005];
void DFS(int u, int start) {
vis[u] = true;
konw[u][start] = konw[start][u] = true;
for (int i = 0; i < Adj[u].size(); i++)
if (!vis[Adj[u][i]])
DFS(Adj[u][i], start);
}
int main() {
scanf("%d%d", &N, &M);
while (M--) {
int a, b;
scanf("%d%d", &a, &b);
Adj[a].push_back(b);
}
int ans = 0;
for (int i = 1; i <= N; i++) {
fill(vis + 1, vis + N + 1, false);
DFS(i, i);
}
for (int i = 1; i <= N; i++)
if (count(konw[i] + 1, konw[i] + N + 1, true) == N)
ans++;
printf("%d", ans);
return 0;
}
201703-1.分蛋糕
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, k, ans = 0, weight = 0;
cin >> n >> k;
vector<int> cake(n);
for (int i = 0; i < n; i++)
cin >> cake[i];
for (int i = 0; i < n; i++) {
weight += cake[i];
if (weight >= k) {
ans++;
weight = 0;
}
}
if (weight > 0)
cout << ans + 1;
else
cout << ans;
return 0;
}
201703-2.学生排队
笔记:注意使用erase()后,原it也将消亡,但它会返回下一个元素的迭代器。
#include <iostream>
#include <list>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
list<int> lst;
for (int i = 1; i <= n; i++)
lst.push_back(i);
while (m--) {
int stu, dist;
cin >> stu >> dist;
auto it = lst.begin();
while (*it != stu)
it++;
it = lst.erase(it);
while (dist > 0) {
it++;
dist--;
}
while (dist < 0) {
it--;
dist++;
}
lst.insert(it, stu);
}
for (int i : lst)
cout << i << " ";
return 0;
}
201612-1.中间数
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> num(n);
for (int i = 0; i < n; i++)
cin >> num[i];
sort(num.begin(), num.end());
int ans = num[n / 2];
int left = 0, right = 0;
for (int i = 0; i < n; i++) {
if (num[i] < ans)
left++;
else if (num[i] > ans)
right++;
}
if (left == right)
cout << ans;
else
cout << -1;
return 0;
}
201612-2.工资计算
201609-1.最大波动
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, ans = 0;
cin >> n;
vector<int> stock(n);
cin >> stock[0];
for (int i = 1; i < n; i++) {
cin >> stock[i];
if (abs(stock[i] - stock[i - 1]) > ans)
ans = abs(stock[i] - stock[i - 1]);
}
cout << ans;
return 0;
}
201609-2.火车购票
#include <iostream>
using namespace std;
int main() {
int seat[20];
for (int i = 0; i < 20; i++)
seat[i] = 5;
int n, ans;
cin >> n;
while (n--) {
cin >> ans;
bool flag = true;
for (int i = 0; i < 20; i++) {
if (seat[i] >= ans) {
flag = false;
int j = i * 5 + 6 - seat[i];
seat[i] -= ans;
while (ans--) {
cout << j << " ";
j++;
}
break;
}
}
if (flag) {
while (ans) {
for (int i = 0; i < 20; i++) {
if (seat[i] != 0) {
cout << i * 5 + 6 - seat[i] << " ";
ans--;
seat[i]--;
}
}
}
}
cout << endl;
}
return 0;
}
201604-1.折点计数
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, ans = 0;
cin >> n;
vector<int> sales(n);
for (int i = 0; i < n; i++)
cin >> sales[i];
for (int i = 1; i < n - 1; i++)
if ((sales[i] > sales[i - 1] && sales[i] > sales[i + 1])
|| (sales[i] < sales[i - 1] && sales[i] < sales[i + 1]))
ans++;
cout << ans;
return 0;
}
201604-2.俄罗斯方块
201512-1.数位之和
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
cin >> str;
int ans = 0;
for (int i = 0; i < str.size(); i++)
ans += str[i] - '0';
cout << ans;
return 0;
}
201512-2.消除类游戏
笔记:利用pair记录待消除点的坐标。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int row, col;//行列
cin >> row >> col;
vector<vector<int>> v(row);
for (int i = 0; i < row; i++) {
v[i].resize(col);
for (int j = 0; j < col; j++)
cin >> v[i][j];
}
vector<pair<int, int>> remove_dot;//记录待消除点的坐标,最后一把消除
for (int i = 0; i < row; i++) {
for (int j = 0; j < col - 2; j++) {
if (v[i][j] == v[i][j + 1] && v[i][j] == v[i][j + 2]) {
remove_dot.push_back(make_pair(i, j));
remove_dot.push_back(make_pair(i, j + 1));
remove_dot.push_back(make_pair(i, j + 2));
}
}
}
for (int j = 0; j < col; j++) {
for (int i = 0; i < row - 2; i++) {
if (v[i][j] == v[i + 1][j] && v[i][j] == v[i + 2][j]) {
remove_dot.push_back(make_pair(i, j));
remove_dot.push_back(make_pair(i + 1, j));
remove_dot.push_back(make_pair(i + 2, j));
}
}
}
for (auto i : remove_dot)
v[i.first][i.second] = 0;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
cout << v[i][j] << " ";
}
cout << endl;
}
return 0;
}
201509-1.数列分段
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n,ans=1;
cin>>n;
vector<int> v(n);
for(int i=0;i<n;i++)
cin>>v[i];
for(int i=1;i<n;i++)
if(v[i]!=v[i-1])
ans++;
cout<<ans;
return 0;
}
201509-2.日期计算
笔记:别大意,二月的下标为1。
#include <iostream>
using namespace std;
int main() {
int y, d;
cin >> y >> d;
int month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
month[1] = 29;
int i = 0;
while (d > month[i++])
d -= month[i - 1];
cout << i << endl << d;
return 0;
}
201503-1.图像旋转
#include <iostream>
#include <vector>
using namespace std;
int main() {
int row, col;
cin >> row >> col;
vector<vector<int>> matrix(row);
for (int i = 0; i < row; i++) {
matrix[i].resize(col);
for (int j = 0; j < col; j++)
cin >> matrix[i][j];
}
for (int j = col - 1; j >= 0; j--) {
for (int i = 0; i < row; i++)
cout << matrix[i][j] << " ";
cout << endl;
}
return 0;
}
201503-2.数字排序
笔记:需要对map的值进行排序时可以将其转化为vector,重定义cmp函数使其符合自己的要求。
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(pair<int, int> a, pair<int, int> b) {
if (a.second != b.second)
return a.second > b.second;
else
return a.first < b.first;
}
int main() {
int n, ans;
cin >> n;
map<int, int> m;
for (int i = 0; i < n; i++) {
cin >> ans;
if (m.count(ans))
m[ans]++;
else
m[ans] = 1;
}
vector<pair<int, int>> v(m.size());
int i = 0;
for (auto it = m.begin(); it != m.end(); it++, i++)
v[i] = make_pair(it->first, it->second);
sort(v.begin(), v.end(), cmp);
for (auto i : v)
cout << i.first << " " << i.second << endl;
return 0;
}
201412-1.门禁系统
#include <iostream>
#include <map>
using namespace std;
int main() {
int n, k;
cin >> n;
map<int, int> m;
for (int i = 0; i < n; i++) {
cin >> k;
if (m.count(k))
m[k]++;
else
m[k] = 1;
cout << m[k] << " ";
}
return 0;
}
201412-2.Z字门扫描
201409-1.相邻数对
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
int n, ans = 0;
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++)
cin >> v[i];
sort(v.begin(), v.end());
for (int i = 0; i < n - 1; i++)
if (v[i + 1] - v[i] == 1)
ans++;
cout << ans;
return 0;
}
201409-2.画图
#include <iostream>
#include <set>
using namespace std;
int main() {
int n, x1, x2, y1, y2;
cin >> n;
set<pair<int, int>> coord;
for (int i = 0; i < n; i++) {
cin >> x1 >> y1 >> x2 >> y2;
for (int j = x1; j < x2; j++)
for (int k = y1; k < y2; k++)
coord.insert(make_pair(j, k));
}
cout << coord.size();
return 0;
}
201409-3.字符串匹配
笔记:关于正则表达式可以参考:blog.csdn.net/qq_34802416…
#include <iostream>
#include <regex>
using namespace std;
int main() {
int j, n;
string s, str;
cin >> s;
scanf("%d%d%*c", &j, &n);
regex r("[[:alpha:]]*" + s + "[[:alpha:]]*");
if (j == 0)//大小写不敏感
r = regex("[[:alpha:]]*" + s + "[[:alpha:]]*", regex::icase);
while (n--) {
cin >> str;
if (regex_match(str, r))
cout << str << endl;
}
return 0;
}
201409-4.最优配餐
201403-1.相反数
#include <iostream>
#include <set>
using namespace std;
int main() {
int n, num, ans = 0;
cin >> n;
set<int> s;
for (int i = 0; i < n; i++) {
cin >> num;
if (s.count(-num))
ans++;
else
s.insert(num);
}
cout << ans;
return 0;
}
201403-2.窗口
笔记:学会定义类,可以方便问题解答。
#include <iostream>
#include <list>
using namespace std;
struct Window {
int num;//编号
int x1, x2, y1, y2;//坐标
};
int main() {
int N, M;
cin >> N >> M;
list<Window> l;
for (int i = 1; i <= N; i++) {
Window w;
w.num = i;
cin >> w.x1 >> w.y1 >> w.x2 >> w.y2;
l.push_front(w);
}
int a, b;
while (M--) {
cin >> a >> b;
bool flag = true;
for (auto it = l.begin(); it != l.end(); it++) {
if (it->x1 <= a && it->x2 >= a && it->y1 <= b && it->y2 >= b) {
cout << it->num << endl;
l.push_front(*it);
l.erase(it);
flag = false;
break;
}
}
if (flag)
cout << "IGNORED" << endl;
}
return 0;
}
201403-3.命令行选项
笔记:小心=和==,粗心就会浪费很多时间。
#include <iostream>
#include <map>
#include <sstream>
using namespace std;
int main() {
int type[128] = { 0 };
string s, t;
cin >> s;
for (int i = 0; i < s.size(); ++i) {
if (s[i + 1] == ':')
type[s[i++]] = 2;
else
type[s[i]] = 1;
}
int n;
scanf("%d%*c", &n);
for (int i = 1; i <= n; i++) {
getline(cin, s);
stringstream ss(s);
map<char, string> m;
ss >> s;
while (ss >> s) {
if (s.size() == 2 && s[0] == '-'&&type[s[1]] == 1)
m[s[1]] = "";
else if (s.size() == 2 && s[0] == '-'&&type[s[1]] == 2 && ss >> t)
m[s[1]] = t;
else
break;
}
cout << "Case " << i << ":";
for (auto it = m.begin(); it != m.end(); it++)
cout << " -" << it->first << " " << it->second;
cout << endl;
}
return 0;
}
201403-4.无线网络
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
struct Router {
long long x, y;//坐标
int cost = 0, addNum = 0;//经过的路由器数量,增设的路由器数量
bool addRouter;//是否是增设的路由器
Router(long long xx, long long yy, bool a = false) :x(xx), y(yy), addRouter(a) {}
};
int n, m, k, r;
vector<Router> routers;//存储所有的路由器
bool isConnect(const int r1,const int r2) {
return (routers[r1].x - routers[r2].x)*(routers[r1].x - routers[r2].x) +
(routers[r1].y - routers[r2].y)*(routers[r1].y - routers[r2].y) <= (long long)r*r;
}
int main() {
cin >> n >> m >> k >> r;
long long xx, yy;
while (n--) {
cin >> xx >> yy;
routers.push_back(Router(xx, yy));
}
while (m--) {
cin >> xx >> yy;
routers.push_back(Router(xx, yy, true));
}
vector<bool> inQueue(routers.size(), false);//记录该路由器是否在队列中
queue<int> q;//路由器队列
q.push(0);//将第一个路由器插入队列
inQueue[0] = true;
while (!q.empty()) {//关键步骤,BFS
int rr = q.front();
q.pop();
if (rr == 1)//从0到1即从第一个路由器到达第二个路由器
break;
for (int i = 0; i < routers.size(); i++) {
if (!inQueue[i] && isConnect(rr, i)) {//如果该路由器不在队列中且可以将它们两个连接,说明发现了一条到达该路由器的路径,将该路由器加入到队列中
if (routers[i].addRouter&&routers[rr].addNum + 1 > k)
continue;//如果超出题目要求的k值,则检测下一个路由器
routers[i].cost = routers[rr].cost + 1;
routers[i].addNum += routers[rr].addNum + routers[i].addRouter ? 1 : 0;
inQueue[i] = true;
q.push(i);
}
}
}
cout << routers[1].cost - 1;
return 0;
}
201312-1.出现次数最多的数
#include <iostream>
#include <map>
using namespace std;
int main() {
int n, num;
cin >> n;
map<int, int> m;
for (int i = 0; i < n; i++) {
cin >> num;
if (m.count(num))
m[num]++;
else
m[num] = 1;
}
auto ans = m.begin();
for (auto it = m.begin(); it != m.end(); it++)
if (it->second > ans->second)
ans = it;
cout << ans->first;
return 0;
}
201312-2.ISBN号码
#include <iostream>
using namespace std;
int main() {
char ch[13];
cin >> ch;
int ans = (ch[0] - '0' + (ch[2] - '0') * 2 + (ch[3] - '0')
* 3 + (ch[4] - '0') * 4 + (ch[6] - '0') * 5 + (ch[7] - '0')
* 6 + (ch[8] - '0') * 7 + (ch[9] - '0') * 8 + (ch[10] - '0') * 9) % 11;
if ((ans == 10 && ch[12] == 'X') || ans == (ch[12] - '0'))
cout << "Right";
else if (ans == 10) {
ch[12] = 'X';
cout << ch;
}
else {
ch[12] = ans + '0';
cout << ch;
}
return 0;
}
201312-3.最大的矩形
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++)
cin >> v[i];
int ans = v[0];
for (int i = 0; i < n; i++) {
int min = v[i];
for (int j = i; j < n; j++) {
if (v[j] < min)
min = v[j];
if ((j - i + 1)*min > ans)
ans = (j - i + 1)*min;
}
}
cout << ans;
return 0;
}