- 题解
模拟题单V-损坏的计分板日志【题解】
- @ 2026-9-16 17:26:24
题单链接:https://fjnuacm.top/d/minor/contest/668a5cbd8077b67dc5c90da4
此题放在入门题单其实比较超纲,推荐是学完搜索算法后再写,会容易很多
损坏的计分日志-题解:
非常纯粹的大模拟
对每个队伍,枚举可能的答对题数 以及可能的罚时
对于每一个可能的枚举,使用 暴力搜索后续部分是否存在满足情况的合法分割即可
比较考验码力
参考代码
#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 条评论
目前还没有评论...