Link:
C:
将每种颜色的连续出现称为一段,寻找总段数即可
#include <bits/stdc++.h> using namespace std; int cnt=0,len; char s[100005]; int main() { scanf("%s",s+1);len=strlen(s+1); for(int i=1;i<=len;i++) if(s[i]!=s[i-1]) cnt++; printf("%d",cnt-1); return 0; }
D:
可以发现对于每一个点的最优解$res_i$为:
$max(w_j)-w_i(j>i)$
找到最小的$res_i$的个数即可
#include <bits/stdc++.h> using namespace std; int n,d,dat[100005],mx,res,cnt; int main() { scanf("%d%d",&n,&d); for(int i=1;i<=n;i++) scanf("%d",&dat[i]); mx=dat[n]; for(int i=n-1;i>=1;i--) { if(mx>dat[i]) { if(mx-dat[i]>res) res=mx-dat[i],cnt=1; else if(mx-dat[i]==res) cnt++; } mx=max(mx,dat[i]); } printf("%d",cnt); return 0; }