首先是PTA
#includeusing namespace std; struct person { string name; int likes; } *Person; bool cmp(pair a, pair b) { return a.first < b.first; } int main() { int n; cin >> n; person persons[n]; map mpname; for(int i = 0;i < n;i ++) { cin >> persons[i].name; mpname[persons[i].name] = persons[i]; } int m; cin >> m; double sum = 0; vector > vec(0); vector > rvec(0); for(int i = 0;i < m;i ++) { string name; int likes; cin >> name >> likes; if(mpname.count(name) > 0) { mpname[name].likes = likes; } else { pair np(name, likes); vec.push_back(np); } // mpname[name].name = name sum += likes; } int aver = sum / m * 1.0; // cout << aver << endl; int len = vec.size(); for(int i = 0;i < len;i ++) { if(vec[i].second > aver && mpname.count(vec[i].first) <= 0) { rvec.push_back(vec[i]); } } sort(rvec.begin(), rvec.end(), cmp); if(rvec.size() > 0) for(int i = 0;i < rvec.size();i ++) { cout << rvec[i].first; if(i != rvec.size() - 1) cout << endl; } else { cout << "Bing Mei You"; } return 0; }
大概思路:
用map记录第一行输入的关注的用户名
在接下来输入用户名的时候,先只存储未关注的用户名(通过map的count来判断是否记录这个用户名,即这个用户是否在关注列表里),不做处理,记录点赞总数
输入完毕后,求得点赞平均值,然后再遍历一遍记录的未关注用户名列表,当他的点赞数超过平均值,就把这个关注用户记录到另外一个vector容器里
记录完“可能的秘密关注用户”列表后,对记录的vector容器进行排序(代码里的rvec, 这里使用了自定义排序),完毕后,依次输出rvec里的用户名即可。
#includeusing namespace std; int main() { int n; cin >> n; vector vec(0), vc(0); int cnt = 0; vector ::iterator it; getchar(); for(int i = 0;i < n;i ++) { string tmp; getline(cin, tmp, 'n'); // cout << tmp.substr(0, 4) << endl; if(tmp.size() == 3) { if(vc.size() >= 1) { cout << vc[vc.size() - 1] << endl; it = lower_bound(vec.begin(), vec.end(), vc[vc.size() - 1]); vc.pop_back(); vec.erase(it); cnt --; } else { cout << "Invalid" << endl; } continue; } else if(tmp.substr(0, 4) == "Push") { int a = atol(tmp.substr(4).c_str()); it = lower_bound(vec.begin(), vec.end(), a); // cout << a << endl; vec.insert(it, a); vc.push_back(a); cnt ++; } else { // cout << vec.size() << endl; if(vec.size() < 1) { cout << "Invalid" << endl; } else { if((vec.size()) % 2 == 0) { cout << vec[((vec.size()) / 2) - 1] << endl; } else { cout << vec[((vec.size()) / 2)] << endl; } } } } return 0; }
大概思路:
特殊栈,要提取小元,这里使用vector容器比较方便,因为我认为它同时拥有“随机访问”和类似栈的特点。
但是用1个vector容器是不够的,因为这样没法存储“所有键值”的中值,输出的结果是不正确的。于是我们要用2个vector容器,一个当类栈用,一个顺序存储所有键值,用于提取中值。
这里用到了vector的iterator,用于顺序存储键值的vector容器的插入新键值以及删除栈顶时同步删除指定键值。
输出时,注意顺序存储键值的vector容器的大小,偶数和奇数有不同的输出位置。
#include#define int long long using namespace std; const int maxn = 1e6 + 1; typedef struct Bend{ int startTime; int ifBorrow; } bend; bend bends[maxn]; main() { int n; cin >> n; for(int i = 0;i < maxn;i ++) { bends[i].ifBorrow = 0; } int num, H = 0, M = 0, borrowTime = 0, cnt = 0; char uselessChar, mode; for(int i = 0;i < n;i ++) { borrowTime = 0; cnt = 0; while(1) { cin >> num >> mode >> H >> uselessChar >> M; if(num == 0) break; if(mode == 'S') { bends[num].startTime = H * 60 + M; bends[num].ifBorrow = 1; } else if(mode == 'E' && bends[num].ifBorrow == 1) { borrowTime += H * 60 + M - bends[num].startTime; cnt ++; bends[num].ifBorrow = 0; } } if(cnt != 0) cout << cnt << ' ' << (int)(borrowTime * 1.0 / cnt + 0.5) << endl; else cout << "0 0" << endl; } }
大概思路:
比较“细节”的输入处理,比较关键的是存储的是每本书的相关数据而不是借阅者的。
这里用结构体表示书本,它们都各自有自己的借阅开始时间和是否被借走标记,后者用于处理无效的还书数据。
关键的部分处理完成后,就是加减法和输出了。
#include#define int long long using namespace std; main() { int column; cin >> column; getchar(); string str; getline(cin, str, 'n'); int len = str.size(); int row; if(len % column != 0) { row = len / column + 1; } else { row = len / column; } char p[column][row]; for(int i = 0;i < column;i ++) for(int j = 0;j < row;j ++) p[i][j] = ' '; int m = 0; for(int i = row - 1;i >= 0;i --) { for(int j = 0;j < column;j ++) { p[j][i] = str[m]; // cout << str[m] << endl; if(m == len - 1) break; m ++; } } for(int i = 0;i < column;i ++) { for(int j = 0;j < row;j ++) { cout << p[i][j]; } if(i != column - 1) cout << endl; } }
大概思路:
一道输出题题题题题,主要就是比较细节的数组大小处理以及赋值逻辑,形成这样的“古风排版”主要还是比较消耗精力和时间去调整细节。
#include#define int long long using namespace std; main() { int column; cin >> column; getchar(); string str; getline(cin, str, 'n'); int len = str.size(); int row; if(len % column != 0) { row = len / column + 1; } else { row = len / column; } char p[column][row]; for(int i = 0;i < column;i ++) for(int j = 0;j < row;j ++) p[i][j] = ' '; int m = 0; for(int i = row - 1;i >= 0;i --) { for(int j = 0;j < column;j ++) { p[j][i] = str[m]; // cout << str[m] << endl; if(m == len - 1) break; m ++; } } for(int i = 0;i < column;i ++) { for(int j = 0;j < row;j ++) { cout << p[i][j]; } if(i != column - 1) cout << endl; } }
大概思路:
结构体处理+排序+输出
没了
CF的题目有点多,就提几个我能讲的比较明白的(bushi
大致题意
我有一堆蛋糕,每个蛋糕的甜度取决于它相邻下一个蛋糕重量和它本身重量之和
我现在给你一个数组,里面是蛋糕的顺序和每个蛋糕的重量
现在我想知道能吃到最甜的蛋糕的数组,蛋糕的最大甜度是多少的
(关键的就那么多了好像)
大概思路
不就是找最大和次大么
遍历一遍数组足矣
#includeusing namespace std; typedef long long ll; int main() { int T; cin >> T; for(int t = 0;t < T;t ++) { int n; cin >> n; ll Big1 = 0; ll Big2 = 0; for(int i = 0;i < n;i ++) { ll tmp; cin >> tmp; if(Big2 == 0 && Big1 == 0) { Big1 = tmp; continue; } if(Big2 == 0 && Big1 != 0) { if(tmp >= Big1) { Big2 = Big1; Big1 = tmp; } else { Big2 = tmp; } continue; } if(tmp >= Big1) { Big2 = Big1; Big1 = tmp; } else if(tmp >= Big2) { Big2 = tmp; } } cout << Big1 + Big2 << endl; } return 0; }
大致题意
我有T串字符串
现在我要把它们前面的字符,如果和后面字符相同的话,就把它删掉
即我要删除它的相等前缀字符串,直到不能删了为止
现在我想知道,当我删到不能删了,最后的字符串长成什么样
大概思路
既然要删,既然要比,那我就遍历呗
每次基本比较位为str[0],即第一个字符,往它后面的位置开始遍历
如果找到str[i] == str[0],那么开始从i位置和0位置同时向后比较相同并记录长度,如:
abcabdd
(省事就不打单引号了哈)str[0] = a, str[3] = a, str[0] == str[3]
这时候开始向后比,发现: str[1] == str[4], str[2] != str[5],于是删除长度为2
这个时候再删除字符串的前2个字符就行了,然后开始下一轮遍历
最后,我们就能得到我们想要的结果
#includeusing namespace std; int main() { int T; cin >> T; for(int t = 0;t < T;t ++) { string str; cin >> str; int len = str.size(); int DO = 1; while(DO) { int posL = 0; int DL = 1; int FR = str.find(str[0], 1); int posR = FR; // cout << FR << endl; if(FR < str.size()) { posR ++; posL ++; while(posR < str.size() && str[posR] == str[posL]) { DL ++; posR ++; posL ++; } str.erase(0, DL); } else { break; } } cout << str << endl; } return 0; }
题目真的很多,CF真的很卡,下次写题解吧
这周主要就是刷题、刷题、刷题(上周我还说着比赛比完了接下来重心应该在JAVA上了,没想到组里又有很多任务下发,于是又没什么太多的时间看JAVA了... ...),但是JAVA也看了,看到了面向对象(下),感觉《疯狂JAVA讲义》这本书细节讲的很多,然后就导致我看的很慢啊... ...
这周任务要是不多的话,一定,一定把JAVA尽快往后推一推。
这大概就是这周的目标吧。



