Codeforces Round #493 (Div. 2)

C - Convert to Ones

给你一个01串 x是反转任意子串的代价 y是将子串全部取相反的代价 问全部变成1的最小代价

两种可能 一种把1全部放到一边 然后把剩下的0变成1  要么把所有的 0 直接变成1

#include<bits/stdc++.h>
using namespace std;
#define LL long long
int main(){
  LL  n,x,y;
  string a;
  cin>>n>>x>>y>>a;
  bool fa=0;
  LL  s=0,s1=0;
  for(LL  j=0;j<a.size();j++){
     if(a[j]=='1'&&fa) continue;
     else if(a[j]=='1'&&fa==0){
        s++;
        fa=1;
     }else if(a[j]=='0') fa=0;
  }
  LL  l=a.size();
  LL ans=0;
  if(a[0]=='0'&&a[l-1]=='0'){
      s1=s+1;
      ans=x*s;
  }else if(a[0]=='0'&&a[l-1]=='1'||a[0]=='1'&&a[l-1]=='0'){
      s1=s;
      ans=x*(max(1LL*0,s-1));
  }else if(a[0]=='1'&&a[l-1]=='1'){
     s1=max(1LL*0,s-1);
     ans=x*(max(1LL*0,s-2));
  }
  ans+=y;
  ans=min(ans,y*s1);
  cout<<ans<<endl;
}

D - Roman Digits

打表? 问 n个字符 能组成几个数

#include<bits/stdc++.h>
using namespace std;
#define LL long long
int ans[50]={0,4,10,20,35,56,83,116,155,198,244,292};
int main() {
    LL n;
    scanf("%lld",&n);
    if (n<=11) printf("%d\n",ans[n]);
    else  printf("%lld\n",292+(n-11)*49);
    return  0;
}

 

posted @ 2018-11-09 14:49  dingyl  阅读(99)  评论(0编辑  收藏  举报