题单链接:https://fjnuacm.top/d/minor/contest/668a5cbd8077b67dc5c90da4

此题放在入门题单其实比较超纲,推荐是学完搜索算法后再写,会容易很多

损坏的计分日志-题解:

\\[5pt]

非常纯粹的大模拟

对每个队伍,枚举可能的答对题数(≤m)(\leq m) 以及可能的罚时

对于每一个可能的枚举,使用 DFSDFS 暴力搜索后续部分是否存在满足情况的合法分割即可

比较考验码力 \\[15pt]

参考代码

#include<bits/stdc++.h>
using namespace std;
#define int long long

int N;

bool dfs(string &s,int lp,int nowtime,int nowcnt,vector<string> &res,int goaltime,int goalcnt)
{
    if(nowtime>goaltime)return 0;
    if(nowcnt>goalcnt)return 0;
    if(lp==(int)s.size())
    {
        if(nowtime==goaltime&&nowcnt==goalcnt)return 1;
        return 0;
    }
    string r;
    bool temp;
    for(int i=lp;;i++)
    {
        if(s[i]=='t')
        {
            if(s[i+2]=='y')
            {
                lp=i+3;
                temp=1;
            }
            else
            {
                lp=i+5;
                temp=0;
            }
            break;
        }
        r+=s[i];
    }
    string fi_time=r;
    fi_time.pop_back();
    string try_cnt;
    try_cnt.push_back(r.back());
    while(1)
    {
        while(1)
        {
            if(fi_time.size()>=2&&fi_time.front()=='0')break;
            if(try_cnt.front()=='0')break;
            int ft=fi_time.empty()?0:stol(fi_time);
            int tc=stol(try_cnt);
            if(ft>=300)break;
            if(tc>100)break;
            if(temp)
            {
                if(tc>1)break;
            }
            else if(tc==1)break;
            if(fi_time.empty())
            {
                res.push_back(try_cnt);
                res.push_back(temp?"try":"tries");
                if(dfs(s,lp,nowtime,nowcnt,res,goaltime,goalcnt))return 1;
                res.pop_back();
                res.pop_back();
            }
            else
            {
                res.push_back(fi_time);
                res.push_back(try_cnt);
                res.push_back(temp?"try":"tries");
                if(dfs(s,lp,nowtime+ft+tc*20-20,nowcnt+1,res,goaltime,goalcnt))return 1;
                res.pop_back();
                res.pop_back();
                res.pop_back();
            }
            break;
        }
        if(temp)break;
        if(fi_time.empty())break;
        try_cnt=fi_time.back()+try_cnt;
        fi_time.pop_back();
    }
    return 0;
}

void solve()
{
    string s;
    cin>>s;
    string r1,r2;
    r1+=s[0];
    r2+=s[0];
    r2+=s[1];
    string s1,s2;
    s1+=s[1];
    vector<string> res;
    for(int i=2;;i++)
    {
        if(s1.size()==1||s1.front()!='0')
        {
            int goalcnt=stol(r1);
            int goaltime=stol(s1);
            if(dfs(s,i,0,0,res,goaltime,goalcnt))
            {
                cout<<r1<<" "<<s1;
                for(auto &t:res)cout<<" "<<t;
                cout<<"\n";
                return;
            }
        }
        if(!s2.empty()&&r2.front()!='0')
        {
            if(s2.size()==1||s2.front()!='0')
            {
                int goalcnt=stol(r2);
                int goaltime=stol(s2);
                if(goalcnt<=N&&dfs(s,i,0,0,res,goaltime,goalcnt))
                {
                    cout<<r2<<" "<<s2;
                    for(auto &t:res)cout<<" "<<t;
                    cout<<"\n";
                    return;
                }
            }
        }
        s1.push_back(s[i]);
        s2.push_back(s[i]);
    }
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int t=1;
    cin>>t;
    cin>>N;
    while(t--)
    {
        solve();
    }
}

0 条评论

目前还没有评论...