刷题杂记
Codeforces Round #581 (Div. 2) d1,d2
【题意】:给一个二进制的子串,然后,问包含0最多的另一个子串是什么,其中这个子串要求任何一个区间的子序列的最长不下降子串要求和原来一样长
【题解】:其实就是一个结论题啦,要保证是一样的话,那么就是要再是适当的时候下降,那么就是后面又几个0,那么前面就是要有多少个1
# include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
long long ans=0;
cin>>s;
for(int i=s.size()-1;i>=0;i--){
if(s[i]=='0') ans++;
else{
if(ans) ans--;
else s[i]='0';
}
}
cout<<s<<endl;
return 0;
}
2008-2009 ACM-ICPC, NEERC, Southern Subregional Contest B
【题意】有n个拉丁字母,m个由这n个拉丁字母组成的单词,将这些拉丁字母组合成键,要求键个数最小而且每一个单词用键去表示的序列不能是一样的。
【题解1】用dfs去搜索
枚举键的总个数,然后暴力判断每一个字母在哪个位置,但是这样写会T,要再加一个优化,就是如果当前这个键的字母的个数为0,那么说明当前这个字母在这个键上是不可以的,在其他空键上还是不可以,那么当前的安排就是不合理的所以就直接return就可以了。
# include <bits/stdc++.h>
using namespace std;
const int MAXN=60;
char s[MAXN][2];
int part[30];//每一个字母的位置
int sum[30];
int n,m;
bool check()
{
for(int i=0;i<m;i++){
for(int j=i+1;j<m;j++){
int a0,b0;
a0=s[i][0]-'a';
b0=s[j][0]-'a';
if(a0==b0||(part[a0]==part[b0]&&part[a0]!=-1)){
int a1,b1;
a1=s[i][1]-'a';
b1=s[j][1]-'a';
if(a1==b1||(part[a1]==part[b1]&&part[a1]!=-1)){
return false;
}
}
}
}
return true;
}
int dfs(int now,int len)
{
int flag;
flag=check();
if(flag==0) return 0;
if(now==n) return 1;
for(int i=1;i<=len;i++){
part[now]=i;
sum[i]++;
if(dfs(now+1,len)) return 1;
part[now]=-1;
sum[i]--;
if(sum[i]==0) return 0;
}
return 0;
}
int main()
{