zoukankan      html  css  js  c++  java
  • 瞎比比系列---1st

    A - 项目管理HDU4858

    /*
    题意:
    这个项目有n个节点,
    两个节点间可能有多条边,不过一条边的两端必然是不同的节点。
    0的时候:接下来两个数u v表示给项目u的能量值加上v;
    1的时候:
    这题就是有多少出去的边数【出度】,就加上对面的点的能量值,输出和
    只是这题如果用矩阵,内存就炸了。所以我们使用vector
    我们用vector[u]=v;vector[v]=u;

    */

    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    #include <algorithm>
    #include <vector>
    using namespace std;
    #define INF 0x3f3f3f
    #define pi acos(-1.0)
    #define LL long long
    #define N 110000
    vector<int>q[N];
    int val[N];
    int n,m;
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            int u,v;
            int num;
            scanf("%d%d",&n,&m);
            for(int i=0;i<=n+10;i++)
            {
                q[i].clear();           //初始化;
                val[i]=0;
            }
            for(int i=0;i<m;i++)
            {
                scanf("%d%d",&u,&v);
                q[u].push_back(v);      //建立起点 u 的边
                q[v].push_back(u);      //建立起点 v 的边
            }
            int f;
            int k;
            int a,b;
            scanf("%d",&num);
            for(int i=0;i<num;i++)
            {
                scanf("%d",&f);
                if(f)
                {
                    scanf("%d",&k);
                    int ans=0;
                    for(int j=0,ss=q[k].size();j<ss;j++)    //遍历以 k 为起点的边
                    {
                        ans+=val[q[k][j]];
                    }
                    printf("%d
    ",ans);
                }
                else
                {
                    scanf("%d%d",&a,&b);
                    val[a]+=b;
                }
            }
        }
        return 0;
    }

    B - TIANKENG’s restaurant HDU4883

    /*
    计算需要的最大凳子数,那也就是说,

    要计算那个点吃饭的人最多就好了- -还瞎想什么
    复杂度可以接受,那就暴力暴力!

    */

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    #define N 24*60             //一天几分钟不会算- -
    
    int s[1500];
    int main()
    {
        int T, n, hh, mm, p, hh1, mm1, p1;
        scanf("%d", &T);
        while(T--)
        {
            scanf("%d", &n);
            memset(s,0,sizeof(s));
            for(int i=0;i<n;i++)
            {
                scanf("%d %d:%d %d:%d", &p, &hh, &mm, &hh1, &mm1);  //转化一下就好了- -
                for(int j=hh*60+mm;j<hh1*60+mm1;j++)                //把在个点吃饭的人加一下
                    s[j]+=p;
            }
            int MAX=0;
            for(int i=1;i<=N;i ++)              //找到一个点的最大
            {
                if(MAX<s[i])
                MAX = s[i];
            }
            printf("%d
    ", MAX);
        }
        return 0;
    }

    E - BestCoder Sequence HDU490

    8
    /*
    题意:
    定义一个 BestCoder Sequence;
    要求存在给定的M,这个M是在这个“BestCoder Sequence”里面,且是中间大的数,而且“BestCoder Sequence”这个序列是在原序列上的一段连续的.计算给定的1—N一段序列,计算这样的bestcoder sequence有多少个。

    那么,以M为头,向两边搞一搞,用一个数去标记,遍历过去是比他大的话的话就+1,比他小的话就-1,然后当这个数==0的时候就是满足条件
    还有就是M在中间的话,我们可以在第一次遍历的时候把比M大的数和比M小的数的差的情况加起来,然后在第二次遍历的时候只要取他的相反数的时候,就是满足条件
    */

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <algorithm>
    #include <queue>
    #include <math.h>
    #include <queue>
    #include <stack>
    using namespace std;
    #define INF 0x3f3f3f
    #define pi acos(-1.0)
    #define LL long long
    #define N 40005
    int a[N];
    int b[N*2];
    int n,m;
    
    void debug()
    {
        for(int i=1;i<=2*n;i++)
        {
            printf("%d ",b[i]);
        }
    }
    
    int main()
    {
        while(~scanf("%d%d",&n,&m))
        {
            int dx;
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&a[i]);
                if(a[i]==m)
                    dx=i;
            }
            int ans=1;
            int xx=0;
            memset(b,0,sizeof(b));
            for(int i=dx-1;i>=1;i--)
            {
                if(a[i]>m)
                    xx++;
                else
                    xx--;
                if(!xx)
                    ans+=1;
                b[xx+n]++;
            }
            xx=0;
            for(int i=dx+1;i<=n;i++)
            {
                if(a[i]>m)
                    xx++;
                else
                    xx--;
                if(!xx)
                    ans+=1;
                ans+=b[n-xx];
            }
           // debug();
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    LintCode A+B问题
    LintCode 斐波纳契数列
    LintCode 删除链表中的元素
    LintCode 整数排序
    c++ lower_bound upper_bound
    259. 3Sum Smaller
    86. Partition List
    209. Minimum Size Subarray Sum
    11. Container With Most Water
    360. Sort Transformed Array
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934557.html
Copyright © 2011-2022 走看看