Codeforces Round #493 (Div. 2)
给你一个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; }
打表? 问 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; }