Codeforces Round #277 (Div. 2)

A题。。。水题。。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll __int64
using namespace std;
int main()
{
	ll n;
	while(scanf("%I64d",&n)==1)
	{
		if(n&1)
		{
			ll ans=(ll)n/(ll)2-n;
			printf("%I64d\n",ans);
		}
		else
		{
			ll ans=(ll)n/(ll)2;
			printf("%I64d\n",ans);
		}
	}
	return 0;
}
B题。。。个人觉得要点想法。。。本人FST了,写法出了点问题,有一种情况无法判断(第31组数据。。)。。。
先把答案矩阵(A矩阵)全部置为1,然后看B矩阵,如果这个点是0,就把这一行一列都置成0,然后统计答案矩阵行列1的个数,最后看B矩阵,如果B矩阵上一个位置是1,那么这一行或一列最少要有一个1,如果没有就是NO了。。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=110;
int mp[MAXN][MAXN];
int row[MAXN],col[MAXN];
int ans[MAXN][MAXN];
int main()
{
	int n,m,i,j,k;
	while(scanf("%d%d",&n,&m)==2)
	{
		memset(row,0,sizeof(row));
		memset(col,0,sizeof(col));
		for(i=0;i<n;i++)
			for(j=0;j<m;j++)
				ans[i][j]=1;
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
			{
				scanf("%d",&mp[i][j]);
				if(!mp[i][j])
				{
					for(k=0;k<n;k++)
						ans[k][j]=0;
					for(k=0;k<m;k++)
						ans[i][k]=0;
				}
			}
		}
		for(i=0;i<n;i++)
			for(j=0;j<m;j++)
			{
				row[i]+=ans[i][j];
				col[j]+=ans[i][j];
			}
		int flag=1;
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
			{
				if(mp[i][j]&&!ans[i][j])
				{
					if(row[i]==0&&col[j]==0)
					{
						flag=0;
						break;
					}
				}
			}
		}
		if(!flag)
		{
			printf("NO\n");
			continue;		}
		printf("YES\n");
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
				printf("%d ",ans[i][j]);
			printf("\n");
		}
	}
	return 0;
}

C题

首先,按上下的次数是一定的,还有就是光标在左边就只要改变左边就好,在右边只要改变右边就好,比如abcdcbz,可以把a变成z花1步,把z变成a也是花一步,边其中一个就可以,所以直接模拟就是。。而且光标只要在其中一半移动就行。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=100010;
char str[MAXN];
int cnt[MAXN];
int main()
{
	int n,p,i,j;
	while(scanf("%d%d",&n,&p)==2)
	{
		scanf("%s",str+1);
		int ans=0;
		int l=MAXN+1;
		int r=-1;
		memset(cnt,0,sizeof(cnt));
		for(i=1;i<=n/2;i++)
		{
			cnt[i]=abs(str[i]-str[n-i+1]);
			if(cnt[i])
			{
				l=min(l,i);
				r=max(r,i);
			}
			if(cnt[i]>13)
				cnt[i]=26-cnt[i];
			ans+=cnt[i];
		}
		if(l==MAXN+1)
		{
			printf("%d\n",ans);
			continue;
		}
		if(n&1)
		{
			int mid=n/2+1;
			if(p<mid)
			{
				if(p>=r)
					ans+=p-l;
				else if(p<=l)
					ans+=r-p;
				else
				{
					int temp1=r-p;
					int temp2=p-l;
					int temp=min(temp1,temp2);
					ans+=temp+r-l;;
				}
			}
			else if(p>mid)
			{
				l=n-l+1;
				r=n-r+1;
				swap(l,r);
				if(p>=r)
					ans+=p-l;
				else if(p<=l)
					ans+=r-p;
				else
				{
					int temp1=r-p;
					int temp2=p-l;
					int temp=min(temp1,temp2);
					ans+=temp+r-l;;
				}
			}
			else
			{
				ans+=mid-l;
			}
		}
		else
		{
			int mid=n/2;
			if(p<=mid)
			{
				if(p>=r)
					ans+=p-l;
				else if(p<=l)
					ans+=r-p;
				else
				{
					int temp1=r-p;
					int temp2=p-l;
					int temp=min(temp1,temp2);
					ans+=temp+r-l;;
				}
			}
			else
			{
				l=n-l+1;
				r=n-r+1;
				swap(l,r);
				if(p>=r)
					ans+=p-l;
				else if(p<=l)
					ans+=r-p;
				else
				{
					int temp1=r-p;
					int temp2=p-l;
					int temp=min(temp1,temp2);
					ans+=temp+r-l;;
				}
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}
/*
7 4
abcdcba
7 4
azcdcba
7 6
azcdcba
7 5
azcdcba
6 3
abzcba
6 6
abzcba
6 1
abczbb
*/
D题

比赛时不会的题。。

就是以每个点为根,遍历生成一棵树,根节点的权值必须不小于其他的点,而且根节点和其他点的差值不大于d,暴力统计个数就行。。

权值相同的点可能会有重复,所以加一个标记,当权值相等时看有没有这个标记。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll __int64
using namespace std;
const int MAXN=2010;
const int MOD=1e9+7;
struct EDGE
{
	int v,next;
}edge[MAXN<<1];
int head[MAXN],size;
bool vis[MAXN];
void init()
{
	memset(head,-1,sizeof(head));
	size=0;
}
void add_edge(int u,int v)
{
	edge[size].v=v;
	edge[size].next=head[u];
	head[u]=size++;
}
int val[MAXN];
int d,n;
ll dfs(int u,int fa,int c)
{
	int i;
	ll sum=1;
	for(i=head[u];i!=-1;i=edge[i].next)
	{
		int v=edge[i].v;
		if(val[v]>c)
			continue;
		if(v==fa)
			continue;
		if(c-val[v]>d)
			continue;
		if(val[v]==c&&vis[v])
			continue;
		sum=sum*dfs(v,u,c)%MOD;
	}
	return sum+1;
}
int main()
{
	int i;
	while(scanf("%d%d",&d,&n)==2)
	{
		for(i=1;i<=n;i++)
			scanf("%d",&val[i]);
		int u,v;
		init();
		for(i=1;i<n;i++)
		{
			scanf("%d%d",&u,&v);
			add_edge(u,v);
			add_edge(v,u);
		}
		memset(vis,0,sizeof(vis));
		ll ans=0;
		for(i=1;i<=n;i++)
		{
			ans--;
			ans=(ans+dfs(i,-1,val[i]))%MOD;
			vis[i]=1;
		}
		printf("%I64d\n",ans);
	}
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蛋白质是生物体中普遍存在的一类重要生物大分子,由天然氨基酸通过肽键连接而成。它具有复杂的分子结构和特定的生物功能,是表达生物遗传性状的一类主要物质。 蛋白质的结构可分为四级:一级结构是组成蛋白质多肽链的线性氨基酸序列;二级结构是依靠不同氨基酸之间的C=O和N-H基团间的氢键形成的稳定结构,主要为α螺旋和β折叠;三级结构是通过多个二级结构元素在三维空间的排列所形成的一个蛋白质分子的三维结构;四级结构用于描述由不同多肽链(亚基)间相互作用形成具有功能的蛋白质复合物分子。 蛋白质在生物体内具有多种功能,包括提供能量、维持电解质平衡、信息交流、构成人的身体以及免疫等。例如,蛋白质分解可以为人体提供能量,每克蛋白质能产生4千卡的热能;血液里的蛋白质能帮助维持体内的酸碱平衡和血液的渗透压;蛋白质是组成人体器官组织的重要物质,可以修复受损的器官功能,以及维持细胞的生长和更新;蛋白质也是构成多种生理活性的物质,如免疫球蛋白,具有维持机体正常免疫功能的作用。 蛋白质的合成是指生物按照从脱氧核糖核酸(DNA)转录得到的信使核糖核酸(mRNA)上的遗传信息合成蛋白质的过程。这个过程包括氨基酸的活化、多肽链合成的起始、肽链的延长、肽链的终止和释放以及蛋白质合成后的加工修饰等步骤。 蛋白质降解是指食物中的蛋白质经过蛋白质降解酶的作用降解为多肽和氨基酸然后被人体吸收的过程。这个过程在细胞的生理活动中发挥着极其重要的作用,例如将蛋白质降解后成为小分子的氨基酸,并被循环利用;处理错误折叠的蛋白质以及多余组分,使之降解,以防机体产生错误应答。 总的来说,蛋白质是生物体内不可或缺的一类重要物质,对于维持生物体的正常生理功能具有至关重要的作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值