• Codeforces Beta Round 77 (Div. 2 Only)



    layout: post
    title: Codeforces Beta Round 77 (Div. 2 Only)
    author: "luowentaoaa"
    catalog: true
    tags:
    mathjax: true
    - codeforces


    传送门

    A - Football (签到)

    题意

    问有没有连续的七个1或者七个0

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const ll mod=1e9+7;
    const int maxn=5e5+50;
    const int inf=1e8;
    char s[150];
    int zero[150],one[150];
    int main()
    {
        cin>>s+1;
        int len=strlen(s+1);
        for(int i=1;i<=len;i++){
            if(s[i]=='1'){
                one[i]=one[i-1]+1;
                zero[i]=0;
            }
            else
                zero[i]=zero[i-1]+1,one[i]=0;
            if(zero[i]>=7||one[i]>=7)puts("YES"),exit(0);
        }
        puts("NO");
        return 0;
    }
    

    B - Lucky Numbers (easy) (dfs)

    题意

    问你大于等于N的最小的只有4和7组成的最小的相同4/7个数的数是多少

    思路

    直接爆搜

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const ll mod=1e9+7;
    const int maxn=5e5+50;
    const ll inf=1e17;
    ll ans=inf;
    ll n;
    void dfs(ll num,ll a,ll b){
        if(a==b&&num>=n)ans=min(ans,num);
        if(num>n*100)return;
        dfs(num*10+4,a+1,b);
        dfs(num*10+7,a,b+1);
    }
    int main()
    {
        cin>>n;
        dfs(0,0,0);
        cout<<ans<<endl;
        return 0;
    }
    

    C - Hockey (模拟 ,题意杀)

    题意

    给你n个禁用子串w1,w2……wn,在主串w中找出与禁用相同的的子串用字母letter替换。若要替换的子串中有字母与letter相同,

    那么就按字典序(PS:如果letter是a,那是b啦,不然就用a好了)去替换。输出时大小写保持不变。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const ll mod=1e9+7;
    const int maxn=1e3+50;
    const ll inf=1e17;
    string s[maxn],sa[maxn],w,wa;
    bool m[maxn];
    char ned;
    string to(string s){
        for(int i=0;s[i];i++)
            if(s[i]>='A'&&s[i]<='Z')s[i]=tolower(s[i]);
        return s;
    }
    int main()
    {
        int n;
        cin>>n;
        for(int i=0;i<n;i++)cin>>s[i],sa[i]=to(s[i]);
        cin>>w;
        wa=to(w);
        cin>>ned;ned=tolower(ned);
        for(int i=0;i<wa.size();i++){
            for(int j=0;j<n;j++){
                if(wa.substr(i,sa[j].size())==sa[j]){
                    for(int k=i;k<i+sa[j].size();k++)m[k]=1;
                }
            }
        }
        for(int i=0;i<wa.size();i++){
            if(m[i]){
                if(wa[i]==ned){
                    char tm;
                    if(wa[i]=='a')tm='b';
                    else tm='a';
                    if(w[i]>='A'&&w[i]<='Z')w[i]=tm-32;
                    else w[i]=tm;
                }
                else if(w[i]>='A'&&w[i]<='Z')w[i]=ned-32;
                else w[i]=ned;
            }
        }
        cout<<w<<endl;
        return 0;
    }
    

    D - Volleyball (最短路)

    题意

    有n个地方,m条路,一个人要从x到y,他要打车走,每条路上都有出租车,出租车走的距离为t,收c元,求从x到y最小花费

    思路

    重建图算出每个点能去哪些点 然后跑bfs或者dij

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const ll mod=1e9+7;
    const int maxn=1e3+50;
    const ll inf=1e17;
    
    int n,m;
    struct node{
        int to;
        ll w;
        bool operator <(const node &a)const{
            return w>a.w;
        }
    };
    vector<node>G[maxn],G2[maxn];
    int x,y;
    ll t[maxn],c[maxn];
    ll val[maxn];
    priority_queue<node>Q;
    void dij(int st){
        for(int i=1;i<=n;i++)val[i]=inf;
        val[st]=0;
        while(!Q.empty())Q.pop();
        Q.push(node{st,0});
        while(!Q.empty()){
            node now=Q.top();
            Q.pop();
            int u=now.to;
            ll w=now.w;
            if(val[u]>t[st])break;
            if(u!=st&&val[u]<=t[st])G2[st].push_back({u,0});
            for(int i=0;i<G[u].size();i++){
                int to=G[u][i].to;
                if(val[to]>val[u]+G[u][i].w){
                    val[to]=val[u]+G[u][i].w;
                    Q.push(node{to,val[to]});
                }
            }
        }
    }
    void dij2(){
        for(int i=1;i<=n;i++)val[i]=inf;
        val[x]=c[x];
        while(!Q.empty())Q.pop();
        Q.push(node{x,val[x]});
        while(!Q.empty()){
            node now=Q.top();Q.pop();
            int u=now.to;
            for(int i=0;i<G2[u].size();i++){
                int v=G2[u][i].to;
                ll tmp=0;
                if(v==y)tmp=c[v];
                if(val[v]>val[u]+c[v]-tmp){
                    val[v]=val[u]+c[v]-tmp;
                    Q.push(node{v,val[v]});
                }
            }
        }
    }
    int main()
    {
        cin>>n>>m;
        cin>>x>>y;
        for(int i=1;i<=m;i++){
            int u,v,w;
            cin>>u>>v>>w;
            G[u].push_back({v,w});
            G[v].push_back({u,w});
        }
        for(int i=1;i<=n;i++){
            cin>>t[i]>>c[i];
            dij(i);
        }
        if(x==y)puts("0"),exit(0);
        dij2();
        if(val[y]==inf)val[y]=-1;
        cout<<val[y]<<endl;
        return 0;
    }
    

    E - Horse Races (数位DP)

    题意

    求区间内幸运数字(4/7)间隔不超过K的数字的个数 区间大小为(10^{1000})

    思路

    一眼数位DP

    (dp[pos][dis][yes]) 表示位置在pos +上一个幸运数字和现在隔多少位置+是否已经有间隔不超过K的幸运数字

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const ll mod=1e9+7;
    const int maxn=5e5+50;
    const ll inf=1e16;
    int k;
    char st[2000],ed[2000];
    ll dp[2000][3000][2];
    
    int num[2000];
    
    ll dfs(int pos,int ok,bool limit,int yes){
        if(pos==-1)return yes;
        if(!limit&&dp[pos][ok][yes]!=-1)return dp[pos][ok][yes];
        int up=limit?num[pos]:9;
        ll ans=0;
        for(int i=0;i<=up;i++){
            int dis=ok+1;
            if(i==4||i==7){
                if(ok<=k)dis=0;
                else dis=1;
            }
            ans+=dfs(pos-1,dis,limit&&i==up,dis==0||yes);
            ans%=mod;
        }
        if(!limit)dp[pos][ok][yes]=ans;
        return ans;
    }
    
    ll acc(char x[]){
        int len=strlen(x);
        for(int i=0;i<len;i++)num[i]=x[len-1-i]-'0';
        return dfs(len-1,k+5,true,false);
    }
    int main()
    {
        int t;
        memset(dp,-1,sizeof(dp));
        ios::sync_with_stdio(false);
        cin>>t>>k;
        while(t--){
            cin>>st>>ed;
            int lena=strlen(st),p=lena-1;
            while(st[p]=='0')st[p--]='9';
            st[p]=st[p]-1;
            cout<<(acc(ed)-acc(st)+mod)%mod<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    JAVA基础知识|HTTP协议-两个特性
    JAVA基础知识|TCP/IP协议
    Spring Cloud|高可用的Eureka集群服务
    Hadoop环境搭建|第四篇:hive环境搭建
    C#中Func与Action的理解
    C# lambda表达式
    WPF ControlTemplate
    sublime text3插件安装及使用
    Dev Express之ImageComboBoxEdit,RepositoryItemImageComboBox使用方式
    SQL查询结果增加序列号
  • 原文地址:https://www.cnblogs.com/luowentao/p/10540464.html
Copyright © 2020-2023  润新知