谎牛计数(春季每日一题 53)
原创
©著作权归作者所有:来自51CTO博客作者sweetheart7_7的原创作品,请联系作者获取转载授权,否则将追究法律责任
奶牛 Bessie 躲在数轴上的某处。
农夫约翰的 头奶牛中的每头奶牛都有一条信息要分享:第 头奶牛说 Bessie 躲在小于或等于 的某个位置,或者说 Bessie 躲在大于或等于
不幸的是,可能不存在躲藏位置与所有奶牛的回答均一致,这意味着并非所有奶牛都在说真话。
计算在撒谎的奶牛的最小数量。
输入格式
输入的第一行包含 。
以下 行每行包含字符 L
或 G
,之后是一个整数 。L
表示第 头奶牛说 Bessie 的躲藏位置小于或等于 ,而 G
表示第 头奶牛说 Bessie 的躲藏位置大于或等于 。
输出格式
输出在撒谎的奶牛的最小数量。
数据范围
,
。
输入样例1:
输出样例1:
样例1解释
有可能没有奶牛在撒谎。
输入样例2:
输出样例2:
样例2解释
至少一头奶牛在撒谎。
// 枚举每一个端点,撒谎的牛的数量等于左边的 L 之和 + 右边的 G 之和
// Bessie 所在位置取端点中间和取端点对答案的影响是一样的
#include<iostream>
#include<algorithm>
#define x first
#define y second
using namespace std;
const int N = 1010;
int n;
pair<int, char> q[N];
int s[N];
int main(){
cin >> n;
for(int i = 1; i <= n; i++) cin >> q[i].y >> q[i].x;
sort(q + 1, q + 1 + n);
for(int i = 1; i <= n; i++){
s[i] = s[i - 1];
if(q[i].y == 'L') s[i]++;
}
int res = n;
for(int i = n, r = 0; i; i--){
int j = i, t = 0;
while(j && q[j].x == q[i].x){
if(q[j].y == 'G') t++;
j--;
}
res = min(res, s[j] + r);
r += t;
i = j + 1;
}
cout << res << endl;
return 0;
}