zoukankan      html  css  js  c++  java
  • Codeforces Div3 #501 A-E(2) F以后补

    感觉自己有点强迫症  不都写出来就找理由不写题解

    http://codeforces.com/contest/1015   题目链接

    A. Points in Segments

    题目意思  n个线段 去覆盖1-m 中的点 问你没有覆盖的点的个数和位置

    这个数据很小,可以直接暴力查找

    思考:如果n<1e6, m<=1e8 呢?    

    #include<bits/stdc++.h>
    #define int long long
    #define MAX(a,b,c) max(a,max(b,c))
    #define MIN(a,b,c) min(a,min(b,c))
    #define pb push_back
    #define fi first
    #define se second
    typedef long long ll;
    typedef long long LL;
    typedef unsigned long long ull;
    typedef unsigned long long uLL;
    using namespace std;
    const int maxn=1e5+10;
    const int INF=0x3f3f3f3f;
    map<int,int> mp;
    int32_t main()
    {
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            int a,b; cin>>a>>b;
            for(int j=a;j<=b;j++)
                mp[j]=1;
        }
        int t=0;
        for(int i=1;i<=m;i++)
        {
            if(mp[i]==0)
            {
                t++;
            }
        }cout<<t<<endl;
        for(int i=1;i<=m;i++)
        {
            if(mp[i]==0)
            {
                cout<<i<<" ";
            }
        }
    }
    A.cpp

    如果 m<=1e8的 话,可以标记 线段的起点 重点后一位     左右搜一遍

    如1-5   a[1]=1; a[6]=-1;

    B. Obtaining the String

    一个n,两个字符串(ss,tt),左右移动前一个字符串 使两个字符串相等  求最小移动次数; 

    对比 ss ,tt 当ss[i] !=tt[i]; 在ss[i]后面找和tt[i]一样的, 移动到ss[i];没有就输出-1;

    #include<bits/stdc++.h>
    #define int long long
    #define MAX(a,b,c) max(a,max(b,c))
    #define MIN(a,b,c) min(a,min(b,c))
    #define pb push_back
    #define fi first
    #define se second
    typedef long long ll;
    typedef long long LL;
    typedef unsigned long long ull;
    typedef unsigned long long uLL;
    using namespace std;
    const int maxn=1e5+10;
    const int INF=0x3f3f3f3f;
    map<int,int> mp;
    vector<int> pp;
    int32_t main()
    {
        int n; cin>>n;
        string ss,tt; cin>>ss; cin>>tt;
        //if(ss==tt) { cout<<-1<<endl; return 0;}
        int j=0;
        for(int i=0;i<n;i++)
        {
            if(ss[j]==tt[i])
            {
                j++; continue;
            }
            int t=0;
            for(int k=j+1;k<n;k++)
            {
    
                if(ss[k]==tt[i])
                {
                    for(int x=k-1;x>=j;x--)
                    {
                            swap(ss[x],ss[x+1]);
                            t=1;
                            pp.push_back(x+1);
                    }
                    if(t==1) { j++;break;}
                }
            }
            if(t==0) { cout<<-1<<endl; return 0;}
        }
        cout<<pp.size()<<endl;
        for(int i=0;i<pp.size();i++)
        {
            cout<<pp[i]<<" ";
        }
    }
    B.cpp

    C. Songs Compression

    n 组数据 一开始的歌曲数据大小  压缩后的数据大小, 要是数据小于等于m;

    直接计算一开始的大小,每次减去 差值最大的;看多少次后数据小于等于m; 压缩不到m就输出-1;

    #include<bits/stdc++.h>
    #define int long long
    #define MAX(a,b,c) max(a,max(b,c))
    #define MIN(a,b,c) min(a,min(b,c))
    #define pb push_back
    #define fi first
    #define se second
    typedef long long ll;
    typedef long long LL;
    typedef unsigned long long ull;
    typedef unsigned long long uLL;
    using namespace std;
    const int maxn=1e5+10;
    const int INF=0x3f3f3f3f;
    int a[maxn];
    int b[maxn];
    int d[maxn];
    int32_t main()
    {
        int n,m; cin>>n>>m;  int ans1=0; int ans2=0;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i]>>b[i];
            d[i]=a[i]-b[i];
            ans1+=a[i];
            ans2+=b[i];
        }
        if(ans2>m) { cout<<-1<<endl;return 0;}
        //if(ans1<=m) {  cout<<0<<endl;return 0;}
        sort(d+1,d+1+n); int t=0;
        for(int i=n;i>=1;i--)
        {
            if(ans1<=m)  break;
            ans1=ans1-d[i];
            t++;
        }
        cout<<t<<endl;
    }
    C.cpp

    D. Walking Between Houses

    在1-n 中走 k次(随你走到哪,不能不走) 使走的路程为 s;

    在保证每次都至少走一步的情况下 先走最大的 1 - n- 1 - n -1 -n....;

    最后再每次走一步;

    10 9 45 来说 每次走的距离为 9 9 9 9 5 1 1 1 1;  

    #include<bits/stdc++.h>
    #define int long long
    #define MAX(a,b,c) max(a,max(b,c))
    #define MIN(a,b,c) min(a,min(b,c))
    #define pb push_back
    #define fi first
    #define se second
    typedef long long ll;
    typedef long long LL;
    typedef unsigned long long ull;
    typedef unsigned long long uLL;
    using namespace std;
    const int maxn=1e5+10;
    const int INF=0x3f3f3f3f;
    int32_t main()
    {
        int n,k,s; cin>>n>>k>>s;
        if(s>(n-1)*k||s<k) { cout<<"NO"<<endl; return 0;}
        cout<<"YES"<<endl;
        int t=0;
        while(s)
        {
            if(s-n+1>=k-1)
            {
                if(t%2==0) cout<<n<<" ";
                else       cout<<1<<" ";
                t++;
                k--;
                s=s-(n-1); //cout<<s<<endl;
            }
            else
            {
                int d=s-(k-1);// cout<<d<<endl;
                int pos=0;
                if(t%2==0) { cout<<1+d<<" "; pos=1+d; }
                else {        cout<<n-d<<" "; pos=n-d;}
                t++;
                k--;
                int x=0;
                while(k)
                {
                    if(x%2==0)
                    {
                        if(pos-1>=1) cout<<pos-1<<" ";
                        else cout<<pos+1<<" ";
                    }
                    else       cout<<pos<<" ";
                    k--;
                    x++;
                }
                break;
            }
        }
    }
    D.cpp

    E1. Stars Drawing (Easy Edition)

    可以直接暴力搜  找到一个点  直接往上下左右搜  看照射的距离  大于1就全部标记

    #include<bits/stdc++.h>
    #define int long long
    #define MAX(a,b,c) max(a,max(b,c))
    #define MIN(a,b,c) min(a,min(b,c))
    #define pb push_back
    #define fi first
    #define se second
    typedef long long ll;
    typedef long long LL;
    typedef unsigned long long ull;
    typedef unsigned long long uLL;
    using namespace std;
    pair<int,int> pos[4]={ {0,1},{0,-1},{1,0},{-1,0} };
    bool tf[105][105];
    char a[105][105];
    int x2[10005];
    int x1[10005];
    int x3[10005];
    int32_t main()
    {
        int n,m; cin>>n>>m; getchar();
        for(int i=0;i<n;i++)
           gets(a[i]);
            int t=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(a[i][j]=='*')
                {
                    //cout<<i<<"   "<<j<<endl;
                     int z=1;
                     while(1)
                     {
                         int x=0;
                         for(int k=0;k<4;k++)
                         {
                             int x1=i+z*pos[k].first;
                             int y1=j+z*pos[k].second;
                             if(x1<0||x1>=n||y1<0||y1>=m)
                             {
                                 continue;
                             }
                             if(a[x1][y1]=='*')
                             {
                                  x++;
                             }
    
                         }
                         //cout<<x<<endl;
                         if(x==4)
                         {
                            tf[i][j]=1;
                           for(int k=0;k<4;k++)
                           {
                             int x1=i+z*pos[k].first;
                             int y1=j+z*pos[k].second;
                             if(x1<0||x1>=n||y1<0||y1>=m)
                             {
                                  continue;
                             }
                             if(a[x1][y1]=='*')
                             {
                                 tf[x1][y1]=1;
                             }
    
                           }
                         }
                         else break;
                         z++;
                     }
                     if(z==1) continue;
                     else
                     {
                         x1[t]=i;
                         x2[t]=j;
                         x3[t]=z-1; t++;
                     }
                }
            }
        } // cout<<t<<endl;
        int k1=0;
        int k2=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(a[i][j]=='*') k1++;
                if(tf[i][j]==1) k2++;
            }
        }
        if(k1!=k2) cout<<-1<<endl;
        else
        {
            cout<<t<<endl;
            for(int i=0;i<t;i++)
            {
                cout<<x1[i]+1<<" "<<x2[i]+1<<" "<<x3[i]<<endl;
            }
        } //cout<<k1<<"  "<<k2<<endl;
    }
    E1.cpp

    E2. Stars Drawing (Hard Edition)

    先预处理 每个点 上下左右 可以照射的距离   再标记

    预处理有些技巧 ,不能暴力搜  要找相邻两个点的关系

    由于预处理 和 标记 分开  不会超时;

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e3+5;
    int l[maxn][maxn];
    int r[maxn][maxn];
    int u[maxn][maxn];
    int d[maxn][maxn];
    int ans1[maxn*maxn];
    int ans2[maxn*maxn];
    int ans3[maxn*maxn];
    char a[maxn][maxn];
    bool f[maxn][maxn];
    int main()
    {
        int n,m;
        cin >> n >> m;
        int i,j,s,y;
        for (i = 1; i <= n; i++)
        for (j = 1; j <= m; j++) cin >> a[i][j];
        for (i = 1; i <= n; i++) for (j = 1; j <= m; j++)
        if (a[i][j] == '*') l[i][j] = l[i][j-1] + 1; else l[i][j] = 0;
    
        for (i = 1; i <= n; i++) for (j = m; j >= 1; j--)
        if (a[i][j] == '*') r[i][j] = r[i][j+1] + 1; else r[i][j] = 0;
    
        for (j = 1; j <= m; j++) for (i = 1; i <= n; i++)
        if (a[i][j] == '*') u[i][j] = u[i-1][j] + 1; else u[i][j] = 0;
    
        for (j = m; j >= 1; j--) for (i = n; i >= 1; i--)
        if (a[i][j] == '*') d[i][j] = d[i+1][j] + 1; else d[i][j] = 0;
        
        int t=1;
        for (i = 1; i <= n; i++)
        for (j = 1; j <= m; j++) if (a[i][j] == '*') {
            s = min(min(r[i][j+1],l[i][j-1]),min(u[i-1][j],d[i+1][j]));
            if (s > 0) {
                ans1[t]=i; ans2[t]=j; ans3[t]=s;  t++;
    
                for (y = j-s; y <= j+s; y++) f[i][y] = 1;
                for (y = i-s; y <= i+s; y++) f[y][j] = 1;
            }
        }
        for (i = 1; i <= n; i++) for (j = 1; j <= m; j++)
        if (a[i][j] == '*' && f[i][j] == 0) {
            cout << -1 << endl;
            return 0;
        }
        cout<<t-1<<endl;
        for(int i=1;i<=t-1;i++)
            cout<<ans1[i]<<" "<<ans2[i]<<" "<<ans3[i]<<endl;
    }
    E2.cpp
  • 相关阅读:
    VSCode 设置 CPP 代码风格
    KiCad EDA 5.1.2 使用圆形板框时出现无法走线的问题
    oracle的sql优化
    mybatis 自动生成xml文件配置
    sql循环遍历
    XML
    oracle的concat的用法
    oracle 按某个字段查询重复数据
    Xshell 4的上传与下载
    Oracle之锁
  • 原文地址:https://www.cnblogs.com/Andromeda-Galaxy/p/9449829.html
Copyright © 2011-2022 走看看