Codeforces Beta Round 77 (Div. 2 Only)
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;
}