1375. Balanced lineup(求最长包含同数量不同品种坐标长度)
来源:互联网 发布:域名注册的网站 编辑:程序博客网 时间:2024/04/27 23:18
/*1375. Balanced lineup(求最长包含同数量不同品种坐标长度) 给出一系列不同品种的牛(0,1)的坐标,要求出一段坐标长度, 该长度包含的两种品种的牛的数量相同 思路:先根据坐标对牛从小到大排序,形成一条串。 然后声明一个大小为100001,因为题目中牛的数量最多为50000, 牛的品种和范围为[-50000,50000](这里使品种1值为1,品种0为-1) 然后从sum[mid](和为0的地方)对牛数组遍历,在遍历到每一头牛 都对其求其前面所有点的权值和,如果之前也存在某个点的权值和 当前权值和相等,则这两个点之间的所有点权值和为0 用一个变量记录下差距最大的值 */#include <iostream>#include <stdlib.h>#include <memory.h>#include <stdio.h>#include <algorithm>using namespace std;struct Cow{ int idx; int seed;}cow[50001];int sum[100001];bool cmp(Cow a, Cow b){ return a.idx < b.idx; }int main(){ int n; scanf("%d", &n); int seed, idx; for(int i=1; i<=n; i++) { scanf("%d %d", &seed, &idx); cow[i].idx = idx; cow[i].seed = (seed == 1 ? 1 : -1); } sort(cow+1, cow+n+1, cmp); //sum的大小为[-50000, 50000]; int middle = 50000; //和为0的下标 int j= middle, s=0;memset(sum, -1, sizeof(sum)); for(int i=1; i<=n; i++){if(sum[j] == -1) //如果和为j的值为空,则记录第一次出现下标 sum[j] = cow[i].idx;j += cow[i].seed; //加上seed后,和为j if(sum[j] != -1) //加上新的seed得到新的j后的值若为不为空则更新最远距离if(s < cow[i].idx - sum[j])s = cow[i].idx - sum[j];}printf("%d\n", s); system("pause"); return 0;}