A. Points and Segments (easy)
题意:给定的区间内0,1的个数之差不能超过一
思路:0,1,0,1...间赋值
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100;
struct node
{
int x,col,id;
}a[maxn];
int n,m,l,r;
bool cmp1(node a,node b)
{
return a.x<b.x;
}
bool cmp2(node a,node b)
{
return a.id<b.id;
}
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){scanf("%d",&a[i].x);a[i].id=i;}
while(m--)cin>>l>>r;
sort(a+1,a+n+1,cmp1);
int tmp=0;
for(int i=1;i<=n;i++)
{
a[i].col=tmp;
tmp^=1;
}
sort(a+1,a+n+1,cmp2);
for(int i=1;i<=n;i++)cout<<a[i].col<<" ";
return 0;
}
B. Balls Game
题意:祖玛游戏,问最多能有多少个球被抵消
思路:枚举插入位置,然后更新最大值
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=110;
int n,m,k,a[maxn];
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
int tmp=0,ans=0,l,r,cnt=0;
for(int i=1;i<=n;i++)
{
if(a[i]==k)
{
l=r=i,cnt=0;
while(a[l]==a[r])
{
tmp=2;
while(l>1&&a[l-1]==a[l])l--,tmp++;
while(r<n&&a[r]==a[r+1])r++,tmp++;
if(tmp<3)break;
cnt+=tmp;
if(l<=1||r>=n)break;
l--,r++;
}
ans=max(cnt-1,ans);
}
}
printf("%d\n",ans);
return 0;
}
C. Xor-tree
题目: 有一棵有根树,根是node 1 ,每个结点都有一个值 0 或者 1 , 你有一个操作 , 就是选择一个点 , 将这个点取反 , 他的儿子结点保持不变 , 他的孙子结点取反 , 儿子的孙子保持不变 。 然后给你每个结点的目标状态,问你需要最少的操作次数使初始状态变到目标状态 ,并且把你改变了哪些结点也输出来 。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=100010;
vector<int> g[maxn],ans;
int n,in[maxn],goal[maxn];
void dfs(int u,int fa,int num1,int num2)//num1表示父结点的父结点的操作次数,num2表示父节点的操作次数
{
if(in[u]^num1!=goal[u])
{
ans.push_back(u);
num1^=1;
}
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(v!=fa)
dfs(v,u,num2,num1);
}
}
int main()
{
int u,v;
scanf("%d",&n);
for(int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
for(int i=1;i<=n;i++)scanf("%d",&in[i]);
for(int i=1;i<=n;i++)scanf("%d",&goal[i]);
dfs(1,-1,0,0);
int len=ans.size();
printf("%d\n",len);
for(int i=0;i<len;i++)cout<<ans[i]<<endl;
return 0;
}