题目描述
局长的食物
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 131072KB;其他语言 655360KB
题目描述:
局长有N种食物,每种食物有Ai份。
每天局长会吃一份食物,或者买一份食物(即每天只能进行吃或买其中的一种动作),这样过了M天
现在局长想知道M天后第p种食物的份数排名(从大到小,相同算并列,例如3 3 2,则排名为1 1 3)
N,M,P<=100,Ai<=1000
输入
第一行N M P
第二行N个数Ai
接下来M行,每行A i或者B i分别表示买一份食物i,吃一份食物i
输出
一个答案
样例输入
3 4 2
5 3 1
B 1
A 2
A 2
A 3
样例输出
1
代码
C++代码1:比较版
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
int food_var[101];
int food_his[101]; // 食物直方图
char food_ways[101];
int food_B[101];
int n, m, p; // n表示食物种类 m表示天数 p表示要查询的第p中食物的份数
cin >> n >> m >> p;
int temp;
// 一行输入完全:建立食物直方图
for (int i = 1; i <= n; ++i){
cin >> temp;
food_his[i] = temp;
}
// 多行输入
char c_temp;
for (int i = 1; i <=m; ++i){
cin >> c_temp >> temp;
// A表示买+1,B表示吃-1
if ('A' == c_temp){
food_his[temp]++;
}
else{
food_his[temp]--;
}
}
/*for (int i = 1; i <=n; ++i){
cout << food_his[i] << endl;
}*/
// 找到排名
//cout << food_his[p]; // 输出
int top = 1;
int comp_value = food_his[p];
for (int i = 1; i <= n; ++i){
if (food_his[i] > comp_value)
top++;
}
cout << top;
return 0;
}
C++代码2:排序版
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <unordered_set>
#include <unordered_map>
#include <vector>
#include <numeric>
#include <limits>
using namespace std;
int A[100 + 5];
int main()
{
int N, M, P;
scanf("%d%d%d", &N, &M, &P);
for (int i = 0; i < N; i++)
scanf("%d", &A[i]);
for (int i = 0; i < M; i++)
{
char c;
int t;
cin >> c >> t;
if (c == 'A')
A[t - 1]++;
else
A[t - 1]--;
}
vector<pair<int, int>> p(N);
for (int i = 0; i < N; i++)
{
p[i].first = A[i];
p[i].second = i;
}
auto cmp = [](const pair<int, int> &a, const pair<int, int> &b)
{
return a.first < b.first;
};
sort(p.begin(), p.end(), cmp);
int d = distance(upper_bound(p.begin(), p.end(), pair<int, int>(A[P - 1], 0), cmp), p.end());
printf("%d\n", d + 1);
return 0;
}
Python版本
if __name__ == "__main__":
(n,m,p) = (int(i) for i in raw_input().split())
d = {}
for index, i in enumerate(raw_input().split()):
d[index+1] = int(i)
for j in range(m):
(act, num) = (i for i in raw_input().split())
if act == "A":
d[int(num)] += 1
else:
d[int(num)] -= 1
r = sorted(d.items(), key=lambda x: x[1], reverse=True)
rr = {}
rank = 1
rr[r[0][0]] = rank
for k in range(1, len(r)):
cur = r[k]
if cur[1] == r[k-1][1]:
rr[cur[0]] = rr[r[k-1][0]]
rank += 1
rr[cur[0]] = rank
print rr[p]