zoukankan      html  css  js  c++  java
  • Codeforces Round #501 (Div. 3)

    这场D题的思维又不会写 2333

    A. Points in Segments

    给出n个区间,求出1~m中有多少点没有没任意一个区间覆盖
    数据范围小,数组标记即可

    #include<bits/stdc++.h>
    using namespace std;
    int f[110];
    int main(){
        int n,m;
        cin>>n>>m;
        for(int i=1,l,r;i<=n;++i){
            cin>>l>>r;
            while(l<=r) {
                f[l++]=1;
            }
        }
        int cnt=0;
        for(int i=1;i<=m;++i){
            if(!f[i]) ++cnt;
        }
        cout<<cnt<<endl;
        for(int i=1;i<=m;++i){
            if(!f[i]) cout<<i<<" ";
        }
        return 0;
    }
    

    B. Obtaining the String

    两个相邻的字母可以交换位置,求s变成t的任意操作方案
    string暴力模拟

    #include<bits/stdc++.h>
    using namespace std;
    string s,t;
    vector<int> ans;
    int main(){
        int n;
        cin>>n;
        cin>>s>>t;
        bool f=1;
        for(int i=0,j=0;j<n;++j,++i){
            if(s[i]!=t[j]){
                int ff=0;
                int k;
                for(k=i;k<n;++k){
                    if(s[k]==t[j]){
                        s.erase(s.begin()+k);
                        s.insert(s.begin()+i,t[j]);
                        ff=1;
                        break;
                    }
                }
                if(ff==0){
                    f=0;
                    break;
                }
                for(int l=k-1;l>=i;--l){
                    ans.push_back(l);
                }
            }
        }
        if(!f) cout<<"-1";
        else {
            cout<<ans.size()<<endl;
            for(int i=0;i<ans.size();++i) cout<<ans[i]+1<<" ";
        }
        return 0;
    }
    

    D. Walking Between Houses

    由1~n个房子排成一列,你需要从1号房子出发,走k次,每次可以走任意步数,但是只能一个方向,并且也不能走出1~n的范围,你需要走k次后恰好移动s步,输出是否可行以及可行的方案
    首先确定NO的条件是:k*(n-1)<s或k>s。每次走s/k步,k次即走了[s/k]*k步,还剩下s%k步没走,再把这剩余的s%k步分到任意次里,即有s%k次走了s/k+1步,(s/k+1不会超出n-1,因为k>=s/(n-1),当=时s%(n-1)=0,也就不需要多走那1步了

    #include<iostream>
    using namespace std;
    int main(){
        long long n,k,s;
        cin>>n>>k>>s;
        if (k*(n-1)<s||k>s){
            cout<<"NO";
            return 0;
        }
        cout<<"YES
    ";
        long long t=1;
        for (int i=1;i<=s%k;i++){
            if (i&1)
                t=s/k+2;
            else
                t=1;
            cout<<t<<' ';
        }
        for(int i=s%k+1;i<=k;i++){
            if (t<=(s/k))
                t+=s/k;
            else
                t-=s/k;
            cout<<t<<' ';
        }
        return 0;
    }
    

    E1. Stars Drawing (Easy Edition)

    给一个n*m的矩阵,'.'表示空白,'*'表示某种物质,多个'*'组合成一个四条边长相等的十字形状的星星,求出所有星星的构造方案,使得每个'*'都至少被一个星星包含,星星的数量不能超过n*m ,(3<=n,m<=100)
    由于星星的数量最大可以到n*m,所以贪心在每'*'构造一个星星,并且让这个星星的边长尽可能地最大以覆盖最多的物质

    #include<bits/stdc++.h>
    using namespace std;
    string s,t;
    vector<int> ans;
    int main(){
        int n;
        cin>>n;
        cin>>s>>t;
        bool f=1;
        for(int i=0,j=0;j<n;++j,++i){
            if(s[i]!=t[j]){
                int ff=0;
                int k;
                for(k=i;k<n;++k){
                    if(s[k]==t[j]){
                        s.erase(s.begin()+k);
                        s.insert(s.begin()+i,t[j]);
                        ff=1;
                        break;
                    }
                }
                if(ff==0){
                    f=0;
                    break;
                }
                for(int l=k-1;l>=i;--l){
                    ans.push_back(l);
                }
            }
        }
        if(!f) cout<<"-1";
        else {
            cout<<ans.size()<<endl;
            for(int i=0;i<ans.size();++i) cout<<ans[i]+1<<" ";
        }
        return 0;
    }
    
  • 相关阅读:
    如何优雅地关闭资源
    JMeter使用教程2——MySQL压测
    JMeter使用教程
    Redis系列(五):消息队列
    Redis系列(四):地理信息
    Redis系列(三):Bitmaps和HyperLogLog
    Redis系列(二):常用操作
    Redis系列(一):安装
    linux命令学习_实验楼(总结)
    【转】Linux中常用的tar解压打包命令语法介绍
  • 原文地址:https://www.cnblogs.com/jjl0229/p/12638359.html
Copyright © 2011-2022 走看看