C.
#include <bits/stdc++.h>
using namespace std;
int n,ans;
char str[100005];
int main(){
scanf("%s",str+1);
n=strlen(str+1);
for (register int i=2; i<=n; ++i) if (str[i]!=str[i-1]) ans++;
printf("%d\n",ans);
return 0;
}
D.
找a[i]<a[j]且a[j]-a[i]最大的对数(i<j)
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,k,h,sum;
int a[N],maxn[N];
map<int,int>mp;
int main(){
scanf("%d%d",&n,&k);
for (register int i=1; i<=n; ++i) scanf("%d",&a[i]);
maxn[n]=a[n];
for (register int i=n-1; i>=1; --i) maxn[i]=max(maxn[i+1],a[i]);
for (register int i=1; i<n; ++i) h=max(h,maxn[i]-a[i]);
if (!h)
{
puts("0");
return 0;
}
for (register int i=n; i>=1; --i)
{
mp[a[i]]=1;
if (mp[a[i]+h]) sum++;
}
printf("%d\n",sum);
return 0;
}
E.
每次找到已知的点权最大的点,然后将它周围没有点权的点的点权均赋值为它的点权-1。
若周围某点已有点权,但点权差不为1,则无解。
每次找已知点权最小点,也是可以的。
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,u,v,x,k;
int a[N];
bool vis[N];
int cnt,head[N];
struct edge{int next,to;}e[N<<1];
struct node
{
int id,v;
inline bool operator < (const node &x) const
{
return x.v<v;
}
};
inline void add(int u,int v)
{
cnt++;
e[cnt].next=head[u];
e[cnt].to=v;
head[u]=cnt;
}
priority_queue<node>q;
int main(){
scanf("%d",&n);
for (register int i=1; i<n; ++i) scanf("%d%d",&u,&v),add(u,v),add(v,u);
scanf("%d",&k);
while (k--)
{
scanf("%d%d",&u,&x);
a[u]=x; vis[u]=true;
q.push((node){u,x});
}
bool jay=true;
while (q.size())
{
node u=q.top(); q.pop();
for (register int i=head[u.id]; i; i=e[i].next)
if (!vis[e[i].to])
{
vis[e[i].to]=true;
a[e[i].to]=a[u.id]+1;
q.push((node){e[i].to,a[e[i].to]});
}
else
{
if (a[e[i].to]!=a[u.id]+1 && a[e[i].to]!=a[u.id]-1) {jay=false; break;}
}
}
if (!jay) puts("No");
else
{
puts("Yes");
for (register int i=1; i<=n; ++i) printf("%d\n",a[i]);
}
return 0;
}
F.
推式子…组合数…
有缘再做…