zoukankan      html  css  js  c++  java
  • Codeforces Round #349 (Div. 2)

    第一题直接算就行了为了追求手速忘了输出yes导致wa了一发。。。

    第二题技巧题,直接sort,然后把最大的和其他的相减就是构成一条直线,为了满足条件就+1

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pi acos(-1)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #define MIN(a,b) a<b ? a:b
    
    using namespace std;
    
    const double g=10.0,eps=1e-9;
    const int N=100000+10,maxn=10000+10,inf=0x3f3f3f;
    
    ll a[N];
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        ll n,sum=0;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            sum+=a[i];
        }
        sort(a,a+n);
        cout<<2*a[n-1]-sum+1<<endl;
        return 0;
    }
    B

    第三题没来的及写就打另一场去了。。。发现是道dp(我估计写了也写不对)用dp[i][0]表示i到i+2能否截取,dp【i】【1】表示i到i+3能否截取

    然后从后向前扫一遍

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cassert>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pi acos(-1)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-9;
    const int N=10000+10,maxn=300,inf=0x3f3f3f;
    
    bool dp[N][2];
    set<string>ans;
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        string s;
        cin>>s;
        for(int i=s.size()-1;i>=5;i--)
        {
            if(i+2==s.size())
            {
                dp[i][0]=1;
                ans.insert(s.substr(i,2));
                continue;
            }
            if(i+3==s.size())
            {
                dp[i][1]=1;
                ans.insert(s.substr(i,3));
                continue;
            }
            if(dp[i+2][1]||(dp[i+2][0]&&s.substr(i,2)!=s.substr(i+2,2)))
            {
                dp[i][0]=1;
                ans.insert(s.substr(i,2));
            }
            if(dp[i+3][0]||(dp[i+3][1]&&s.substr(i,3)!=s.substr(i+3,3)))
            {
                dp[i][1]=1;
                ans.insert(s.substr(i,3));
            }
        }
        cout<<ans.size()<<endl;
        set<string>::iterator it;
        for(it=ans.begin();it!=ans.end();it++)
            cout<<*it<<endl;
        return 0;
    }
    C

    D题给一个有向有环图,从中找四个点,每个点之间的距离是最短路,求这四个点距离的最大值

    先吧每个点跑一边spfa记录下i到j的最小距离,然后枚举b到c,找点a和点c,使得路径最长,但是直接全部枚举是O(n^4)会爆掉,所以用vector存一下到每个点的最长的3个距离(因为已经枚举了两个点)

    然后复杂度就降到O(9n^2)了

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cassert>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pi acos(-1)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-9;
    const int N=3000+10,maxn=5000+10,inf=0x3f3f3f;
    
    struct edge{
        int to,Next,w;
    }e[maxn];
    int head[N],cnt;
    int n,m;
    int d[N],ans[N][N];
    void add(int u,int v)
    {
        e[cnt].to=v;
        e[cnt].w=1;
        e[cnt].Next=head[u];
        head[u]=cnt++;
    }
    void spfa(int x)
    {
        bool vis[N];
        memset(vis,0,sizeof vis);
        vis[x]=1;
        memset(d,inf,sizeof d);
        d[x]=0;
        queue<int>q;
        q.push(x);
        while(!q.empty()){
            int s=q.front();
            q.pop();
            vis[s]=0;
            for(int i=head[s];~i;i=e[i].Next)
            {
                int W=e[i].w,To=e[i].to;
                if(d[s]+W<d[To])
                {
                    d[To]=d[s]+W;
                    if(!vis[To])
                    {
                        vis[To]=1;
                        q.push(To);
                    }
                }
            }
        }
        for(int i=1;i<=n;i++)
            ans[x][i]=min(ans[x][i],d[i]);
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin>>n>>m;
        cnt=0;
        memset(head,-1,sizeof head);
        for(int i=0;i<m;i++)
        {
            int x,y;
            cin>>x>>y;
            add(x,y);
        }
        memset(ans,inf,sizeof ans);
        for(int i=1;i<=n;i++)ans[i][i]=0;
        for(int i=1;i<=n;i++)
            spfa(i);
      /*  for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
                cout<<ans[i][j]<<" ";
            cout<<endl;
        }*/
        int cur=0,a,b,c,d;
        //求每一个点的最远距离
        vector<pair<int,int> >v1[N],v2[N];
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(i==j)continue;
                if(ans[i][j]<inf)v1[i].push_back(make_pair(ans[i][j],j));
                if(ans[j][i]<inf)v2[i].push_back(make_pair(ans[j][i],j));
            }
            sort(v1[i].begin(),v1[i].end());
            reverse(v1[i].begin(),v1[i].end());
            sort(v2[i].begin(),v2[i].end());
            reverse(v2[i].begin(),v2[i].end());
        }
        for(int i=1;i<=n;i++)//b
        {
            for(int j=1;j<=n;j++)//c
            {
                if(i==j||ans[i][j]>=inf)continue;
                for(int k=0;k<4&&k<v2[i].size();k++)//a
                {
                    int ccc=v2[i][k].second;
                    if(ccc==i||ccc==j)continue;
                    for(int l=0;l<4&&l<v1[j].size();l++)//d
                    {
                        int ddd=v1[j][l].second;
                        if(ddd==i||ddd==j||ddd==ccc)continue;
                        if(cur<ans[i][j]+v1[j][l].first+v2[i][k].first)
                        {
                            cur=ans[i][j]+v1[j][l].first+v2[i][k].first;
                            a=ccc,b=i,c=j,d=ddd;
                        }
                    }
                }
            }
        }
        //cout<<cur<<endl;
        cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;
        return 0;
    }
    D

    E待补

  • 相关阅读:
    python 购物车和三级菜单
    python-装饰器
    day3 python 函数
    day3 python 集合 文件
    two day python基础知识
    python-day 1
    Cordova 环境搭建
    javascript在html直接传值
    JavaScript疑难点
    Javascript创建对象的方法
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7132626.html
Copyright © 2011-2022 走看看