首先是PTA
#include <bits/stdc++.h>
using namespace std;
struct person {
string name;
int likes;
} *Person;
bool cmp(pair<string, int> a, pair<string, int> b)
{
return a.first < b.first;
}
int main()
{
int n;
cin >> n;
person persons[n];
map<string, person> 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<pair<string, int>> vec(0);
vector<pair<string, int>> 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<string, int> 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里的用户名即可。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> vec(0), vc(0);
int cnt = 0;
vector<int>::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<iostream>
#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<bits/stdc++.h>
#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<bits/stdc++.h>
#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
大致题意
我有一堆蛋糕,每个蛋糕的甜度取决于它相邻下一个蛋糕重量和它本身重量之和
我现在给你一个数组,里面是蛋糕的顺序和每个蛋糕的重量
现在我想知道能吃到最甜的蛋糕的数组,蛋糕的最大甜度是多少的
(关键的就那么多了好像)
大概思路
不就是找最大和次大么
遍历一遍数组足矣
#include <bits/stdc++.h>
using 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个字符就行了,然后开始下一轮遍历
最后,我们就能得到我们想要的结果
#include <bits/stdc++.h>
using 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尽快往后推一推。
这大概就是这周的目标吧。