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;}

原创粉丝点击