Educational Codeforces Round 82 Rated for Div. 2
比赛链接 https://codeforces.com/contest/1303
比赛记录 https://blog.csdn.net/cheng__yu_/article/details/105395197
A. Erasing Zeroes
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=2e5+10,inf=1e9;
int t;
string s;
int main()
{
cin>>t;
while(t--)
{
cin>>s;
for(int i=0;i<s.size();++i)
{
if(s[i]=='0') s.erase(s.begin()+i),--i;
else break;
}
for(int i=s.size()-1;i>0;--i)
{
if(s[i]=='0') s.erase(s.begin()+i);
else break;
}
int ans=count(s.begin(),s.end(),'0');
cout<<ans<<"\n";
}
return 0;
}
B. National Project(思维)
题意:在阴晴两种天气修马路,晴天修的马路高质量,阴天修的马路低质量,需要使得高质量的马路至少为一半,问至少需要几天完成
思路:当时居然确实被困住了
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+5,maxm=1e5+5;
int t;
ll n,g,r;
int main()
{
cin>>t;
while(t--)
{
cin>>n>>g>>r;
ll x;
if(n&1)
x=n/2+1;
else
x=n/2;
ll ans;
if(x%g==0)
{
ll t=x/g;
ans=(t-1)*(g+r)+g;
ans+=max(0ll,n-x-(t-1)*r);
}
else
{
ll t=x/g;
ans=t*(g+r)+x%g;
ans+=max(0ll,n-x-t*r);
}
cout<<ans<<"\n";
}
}
C. Perfect Keyboard(模拟 || DFS)
题意:自己构造一个26字母的键盘,使得给定的密码在键盘上是连续的
思路:两种思路:一种是拿个指针模拟一下。另一种是建一个图,同入度为1 的点开始dfs
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7,maxm=1e5+5;
int t;
string s;
void solve()
{
cin>>s;
int p=0,n=s.size();
string ans=s.substr(0,1);
for(int i=1;i<n;++i)
{
if(p-1>=0&&ans[p-1]==s[i])
p--;
else if(p+1<n&&ans[p+1]==s[i])
p++;
else if(p+1==ans.size())
p++,ans+=s[i];
else if(p==0)
ans=s[i]+ans;
else
{
puts("NO");
return;
}
}
for(int i=1;i<=26;++i)
{
char c='a'+i-1;
if(count(ans.begin(),ans.end(),c)==0)
ans+=c;
}
if(ans.size()!=26)
puts("NO");
else
{
puts("YES");
cout<<ans<<"\n";
}
}
int main()
{
cin>>t;
while(t--)
{
solve();
}
}
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+5,maxm=1e5+5;
int t;
string s;
int m[30][30];
int cnt[30],visit[30];
string ans;
void dfs(int u)
{
ans+=u+'a'-1;
for(int j=1;j<=26;++j)
{
if(!visit[j]&&m[u][j])
{
visit[j]=true;
dfs(j);
}
}
}
void solve()
{
cin>>s;
memset(m,0,sizeof(m));
memset(cnt,0,sizeof(cnt));
memset(visit,0,sizeof(visit));
if(s.size()==1)
{
puts("YES");
string ans="";
for(int i=1;i<=26;++i)
ans+=i+'a'-1;
cout<<ans<<"\n";
return;
}
for(int i=1;i<s.size();++i)
{
int u=s[i-1]-'a'+1,v=s[i]-'a'+1;
m[u][v]=m[v][u]=1;
}
for(int i=1;i<=26;++i)
for(int j=1;j<=26;++j)
cnt[i]+=m[i][j];
int in3=-1,in1=-1;
for(int i=1;i<=26;++i)
{
if(cnt[i]>2)
in3=i;
if(cnt[i]==1)
in1=i;
}
if(in3!=-1||in1==-1)
{
puts("NO");
return;
}
visit[in1]=true;
ans="";
dfs(in1);
for(int i=1;i<=26;++i)
if(cnt[i]==0)
ans+=i+'a'-1;
cout<<"YES\n"<<ans<<"\n";
}
int main()
{
cin>>t;
while(t--)
solve();
}
D. Fill The Bag(二进制)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+5,maxm=1e5+5;
const int mod=1e9+7,inf=0x7f7f7f7f;
int t,m,x;
ll n;
int cnt[65];
int calc(ll n)
{
int ans=-1;
while(n)
{
ans++;
n>>=1;
}
return ans;
}
int main()
{
cin>>t;
while(t--)
{
memset(cnt,0,sizeof(cnt));
cin>>n>>m;
ll sum=0;
for(int i=1;i<=m;++i)
{
cin>>x;
cnt[calc(x)]++;
sum+=x;
}
if(sum<n)
{
puts("-1");
continue;
}
int tot=calc(n);
sum=0;
ll ans=0;
for(int i=0;i<=62&&i<=tot;++i)
{
if(n>>i&1)
sum--;
if(sum<0)
{
int p=i;
while(!cnt[p])
cnt[p++]=1;
cnt[p]--;
ans+=p-i;
sum++;
}
sum+=cnt[i];
sum>>=1;
}
printf("%lld\n",ans);
}
return 0;
}