题目一
1. 描述
输入描述
第一行一个正整数n,表示接下来有n条操作,(1<= n <= 10000)
接下来n行,每行是两种操作中的一种:
append x y: 其中x y是两个正整数,表示接收到新闻x的热度提升了y。(新闻编号x的范围是[1.1000],单次热度提升y的范围是[1,1000])
query:用户向你发来查询。
输出描述:
对于每条用户查向,输出最高的十条新闻,以空格分隔。不足十条时,有几条输出几条。没有新闻时,输i出null, 每条查询的输出占一行。
2. 代码
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <cmath>
using namespace std;
bool cmp(pair<int, int> a , pair<int,int> b)
{
if(a.second> b.second){
return true;
}
else if(a.second== b.second)
{
if(a.first < b.first){
return true;
}else{
return false;
}
}else{
return false;
}
}
int main()
{
int N = 0;
cin >> N;
unordered_map<int, int> map_s;
for(int i = 0; i < N; i++){
string ss = "";
cin >> ss;
if(ss == "append"){
int news = 0;
int hot = 0;
cin >> news >> hot;
if(map_s.find(news) == map_s.end()){
map_s[news] = hot;
}else{
map_s[news] += hot;
}
}else{
if(map_s.size() == 0){
cout << "null" << endl;
}else{
vector<pair<int,int> > vec;
for(auto it = map_s.begin(); it != map_s.end(); it++)
{
vec.push_back(pair<int,int>(it->first, it->second));
}
sort(vec.begin(), vec.end(), cmp);
int len = vec.size();
int nums = min(len, 10);
for(int i = 0; i < nums; i++){
cout << vec[i].first << " ";
}
cout << endl;
}
}
}
return 0;
}
题目二
1. 描述
输入描述
第一行三个正整数n, m, k,其中n代表玩具兵团A的小队数量,m代表玩具兵团的小队数量,k代表战场要求的战斗力最低值。
接下来n行,银行两个正整数xy,表示玩具兵团A的其中支小队有X个战斗力为y的玩具兵。
接下来m行,银行两个正整数xy,表示玩具兵团B的其中一支小队有X个战斗力为y的玩具兵。
1 <= n, m <=1000, 1 <= k <= 1000, 1<= x, y <=1e9
输出描述
第一行两个正整数, 以空格分割,分别表示小美能派出的战斗力总和, 小团能派出的战斗力总和。
第二行一个字符A或者B表示获胜方是小美还是小团,若小要获胜则输出A,反之则B。
2. 代码
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <cmath>
using namespace std;
int main(){
int m = 0;
int t = 0;
int k = 0;
cin >> m >> t >> k;
unsigned int A = 0;
unsigned int B = 0;
for(int i = 0; i < m; i++){
unsigned int num;
unsigned int val;
cin >> num >> val;
if(val >= k){
A += num * val;
}
}
for(int i = 0; i < t; i++){
unsigned int num;
unsigned int val;
cin >> num >> val;
if(val >= k){
B += num * val;
}
}
cout << A << " " << B << endl;
if(A > B){
cout << 'A' << endl;
}else{
cout << 'B' << endl;
}
}
题目三
1. 描述
输入描述
第一行一个正整数N,表示小美的调度操作数量。
接下来有N行,每行表示一个调度操作。其格式为下列两种之一:
1 x y: x为一个正整数,y为一个字符串,表示在原列车序列的基础上增加一一个车厢x,该车厢从属于y系列。
2 x y : x和y均为字符串,表示替换x系列和y系列在原车厢序中的位置。保证替换操作合法,即替换x系列和y系列时,这两种系列一定存在于列车序列中。
表示车厢系列的字符串将仅由大写字母组成。长度不超过5个字符。
输出描述
一行,按照从前到后的顺序给出调度结束后的车厢序列。车厢序号以一个空格隔开
2. 代码
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <cmath>
using namespace std;
int main(){
unordered_map<string, int> pos;
unordered_map<string, vector<int> > train;
int N = 0;
cin >> N;
int level = 0;
for(int i = 0; i < N; i++){
int flag = 0;
cin >> flag;
if(flag == 1){
int num = 0;
string group = "";
cin >> num;
cin >> group;
train[group].push_back(num);
if(train[group].size() == 1){
pos[group] = level;
level++;
}
}else if(flag == 2){
string t1 = "";
string t2 = "";
cin >> t1;
cin >> t2;
int tmp = pos[t1];
pos[t1] = pos[t2];
pos[t2] = tmp;
}
}
for(int i = 0; i < level; i++){
for(auto it: pos){
if(it.second == i){
for(int j = 0; j < train[it.first].size(); j++){
cout << train[it.first][j] << " ";
}
break;
}
}
}
}
题目四
1. 描述
输入描述
第一行三个正整数n和m和k,表示有n个节点编号从1到n,并将给出m个节点关系,根节点编号是k。
接下来有m行,每行三个正整数t和xy,表示t的左儿子节点是x,右儿子节点是y。保证可以用这m个关系构建出n个点且以k为根的树。
接下来给出一行n个正整数,以空格分隔,分别代表每个节点的临界值。
输出描述
一行 一个正整数表示不能冲浪到的节点数量。
2. 代码
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <cmath>
#include <bits/stdc++.h>
using namespace std;
struct Node{
int val;
Node* left;
Node* right;
Node(int _val):val(_val),left(nullptr),right(nullptr){
};
};
int res=0;
void dfs(Node* root,int low,int high){
if(!root) return;
if(!root->left&&!root->right){
++res;
return;
}
if(root->val>=high){
++res;
dfs(root->left,low,high);
}else if(root->val<low){
++res;
dfs(root->right,low,high);
}else{
++res;
dfs(root->left,low,root->val);
dfs(root->right,root->val,high);
}
}
int main(){
int n,m,k;
cin>>n>>m>>k;
vector<Node*> tree(n+1);
for (int i = 1; i <=n; ++i) {
tree[i]=new Node(0);
}
for (int i = 0; i <m; ++i) {
int t,x,y;
cin>>t>>x>>y;
tree[t]->left=tree[x];
tree[t]->right=tree[y];
}
for (int i = 1; i <=n; ++i) {
int val;
cin>>val;
tree[i]->val=val;
}
dfs(tree[k],INT_MIN,INT_MAX);
cout<<n-res<<endl;
}