A. Diverse Strings
题意:
给一组字符串,判断这个字符串排序后是不是连续的,且每个字符只出现一次
解析:
直接按题意模拟就可以
ac:
#include<bits/stdc++.h>
#define IOS std::ios::sync_with_stdio(false);
#define pb push_back
#define ll long long
#define mod 1000000007
#define per(i,a,b) for(int i=a;i<b;i++)
#define rep(i,a,b) for(int i=a;i>=b;i--)
#define MAXN 105
using namespace std;
char str[MAXN]={0};
int a[MAXN];
int main()
{
IOS
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",&str);
int len=strlen(str);
for(int i=0;i<len;i++)
a[i]=str[i]-'a';
sort(a,a+len);
int flag=0;
for(int i=0;i<len-1;i++)
if(a[i]!=a[i+1]-1)
flag=1;
if(flag)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}
B. Parity Alternated Deletions
题意:
给一个数组
可以删除一个数,如果该数是偶数,呢么下次删除就一定要删除奇数,如果该数是奇数,呢么下次删除就一定要删除偶数
解析:
直接模拟,删除min(a.size,b.size)个,然后看哪个多,再删一个
ac:
#include<bits/stdc++.h>
#define IOS std::ios::sync_with_stdio(false);
#define pb push_back
#define ll long long
#define mod 1000000007
#define per(i,a,b) for(int i=a;i<b;i++)
#define rep(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
vector<int> aa,bb;
int main()
{
IOS
int x,n;
scanf("%d",&n);
ll sum=0;
for(int i=0;i<n;i++)
{
scanf("%d",&x);
sum+=x;
if(x%2==0)
aa.pb(x);
else
bb.pb(x);
}
int c=aa.size();
int d=bb.size();
sort(aa.begin(),aa.end(),greater<int>());
sort(bb.begin(),bb.end(),greater<int>());
int e=min(c,d);
ll suma=0,sumb=0;
for(int i=0;i<e;i++)
{
sumb+=bb[i];
suma+=aa[i];
}
if(c>e)
suma+=aa[e];
if(d>e)
sumb+=bb[e];
printf("%lld\n",sum-suma-sumb);
return 0;
}
C. Two Shuffled Sequences
题意:
给一个数组
将数组分为两个数组,一个严格递减,一个严格递增,问能否分成这两个数组
解析:
直接模拟就可以
ac:
#include<bits/stdc++.h>
#define IOS std::ios::sync_with_stdio(false);
#define pb push_back
#define ll long long
#define mod 1000000007
#define per(i,a,b) for(int i=a;i<b;i++)
#define rep(i,a,b) for(int i=a;i>=b;i--)
#define MAXN 500005
using namespace std;
int a[MAXN]={0};
int vis[MAXN]={0};
vector<int> aa,bb;
int main()
{
IOS
int n,maxs=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
maxs=max(a[i],maxs);
vis[a[i]]++;
}
sort(a,a+n);
for(int i=0;i<=maxs;i++)
{
if(vis[i]>2)
{
printf("NO\n");
return 0;
}
}
printf("YES\n");
int flag=0;
for(int i=0;i<=maxs;i++)
{
if(vis[i]>0)
{
aa.pb(i);
vis[i]--;
}
}
for(int i=maxs;i>=0;i--)
{
if(vis[i]>0)
{
bb.pb(i);
vis[i]--;
}
}
int ad=aa.size();
printf("%d\n",ad);
for(int i=0;i<ad-1;i++)
printf("%d ",aa[i]);
if(ad>0)
printf("%d\n",aa[ad-1]);
int bd=bb.size();
printf("%d\n",bd);
for(int i=0;i<bd-1;i++)
printf("%d ",bb[i]);
if(bd>0)
printf("%d\n",bb[bd-1]);
printf("\n");
return 0;
}
D. Equalize Them All
解析:
给一个数组,相邻数组元素之间可以相互转换,问最少转换次数,和转发方式,转方式有两种
直接模拟
ac:
#include<bits/stdc++.h>
#define IOS std::ios::sync_with_stdio(false);
#define pb push_back
#define ll long long
#define mod 1000000007
#define per(i,a,b) for(int i=a;i<b;i++)
#define rep(i,a,b) for(int i=a;i>=b;i--)
#define MAXN 500005
using namespace std;
int a[MAXN];
int vis[MAXN];
struct node
{
int a,b,c;
}ee[MAXN];
int main()
{
IOS
int n,maxs=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
vis[a[i]]++;
maxs=max(maxs,a[i]);
}
int qq=0,pp=0;
for(int i=0;i<=maxs;i++)
{
if(vis[i]>pp)
{
pp=vis[i];
qq=i;
}
}
if(pp==n)
{
printf("0\n");
return 0;
}
int qc=-1;
for(int i=1;i<=n;i++)
{
if(a[i]==qq)
{
qc=i;
break;
}
}
int j=0;
for(int i=qc-1;i>=1;i--)
{
if(a[i]>qq)
ee[j].a=2,ee[j].b=i,ee[j].c=i+1;
else
ee[j].a=1,ee[j].b=i,ee[j].c=i+1;
j++;
}
for(int i=qc+1;i<=n;i++)
{
if(a[i]==qq)
continue;
if(a[i]>qq)
ee[j].a=2,ee[j].b=i,ee[j].c=i-1;
else
ee[j].a=1,ee[j].b=i,ee[j].c=i-1;
j++;
}
printf("%d\n",j);
for(int i=0;i<j;i++)
printf("%d %d %d\n",ee[i].a,ee[i].b,ee[i].c);
return 0;
}
E. Median String
题意
给一个字符串a,字符串b,要输出字符串c,字符串c是a,b按字典序的中位(b字典序一定比a大奇数)
解析:
c=(a+b)/2,模拟26进制大数加法和除法
ac:
#include<bits/stdc++.h>
#define MAXN 400005
using namespace std;
int n;
char str[MAXN],ctr[MAXN],gtr[MAXN];
int a[MAXN],b[MAXN],c[MAXN];
int main()
{
scanf("%d",&n);
scanf("%s%s",&str,&ctr);
for(int i=n-1;i>=0;i--)
{
a[i]=str[i]-'a';
b[i]=ctr[i]-'a';
}
for(int i=n-1;i>=0;i--)
{
c[i]+=a[i]+b[i];
if(i)
{
c[i-1]+=c[i]/26;
c[i]=c[i]%26;
}
}
for(int i=0;i<n;i++)
{
int ret=c[i]%2;
c[i]=c[i]/2;
if(ret&&i!=n-1)
c[i+1]+=ret*26;
gtr[i]='a'+c[i];
}
for(int i=0;i<n;i++)
printf("%c",gtr[i]);
printf("\n");
return 0;
}
c=a+(b-a)/2
ac:
#include<bits/stdc++.h>
#define MAXN 400005
using namespace std;
int n;
char str[MAXN],ctr[MAXN];
int a[MAXN];
int main()
{
scanf("%d",&n);
scanf("%s%s",&str,&ctr);
for(int i=n-1;i>=0;i--)
{
a[i]+=ctr[i]-str[i];
if(a[i]<0&&i)
a[i-1]--,a[i]+=26;
}
for(int i=0;i<n;i++)
{
int ret=abs(a[i]%2);
a[i]/=2;
if(i!=n-1)
a[i+1]+=ret*26;
}
for(int i=n-1;i>=0;i--)
{
if(i&&a[i]+str[i]-'a'>=26)
a[i]-=26,a[i-1]+=1;
}
for(int i=0;i<n;i++)
printf("%c",str[i]+a[i]);
printf("\n");
return 0;
}
F. Graph Without Long Directed Paths
给定一个无向图
问能否得到一个有向图,图中的边方向不连续,输出边的方向
ac:
图染色问题,用广搜搜索判断
ac:
#include<bits/stdc++.h>
#define MAXN 250005
using namespace std;
vector<int> vc[MAXN];
int a[MAXN],b[MAXN];
int color[MAXN];
int n,m;
void bfs()
{
queue<int> que;
que.push(1);
color[1]=0;
while(!que.empty())
{
int u=que.front();
que.pop();
int len=vc[u].size();
for(int i=0;i<len;i++)
{
int v=vc[u][i];
if(color[v]==-1)
{
color[v]=1-color[u];
que.push(v);
}
else if(color[v]==color[u])
{
printf("NO\n");
return ;
}
}
}
printf("YES\n");
for(int i=0;i<m;i++)
printf("%d",color[a[i]]);
printf("\n");
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++)
color[i]=-1;
for(int i=0;i<m;i++)
{
scanf("%d%d",&a[i],&b[i]);
vc[a[i]].push_back(b[i]);
vc[b[i]].push_back(a[i]);
}
bfs();
return 0;
}