首先是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;
}
#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尽快往后推一推。
这大概就是这周的目标吧。