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;
}



源码来自:https://pan.quark.cn/s/41b9d28f0d6d 在信息技术领域中,jQuery作为一个广受欢迎的JavaScript框架,显著简化了诸多操作,包括对HTML文档的遍历、事件的管理、动画的设计以及Ajax通信等。 本篇文档将深入阐释如何运用jQuery达成一个图片自动播放的功能,这种效果常用于网站的轮播展示或幻灯片演示,有助于优化用户与页面的互动,使网页呈现更加动态的视觉体验。 为了有效实施这一功能,首先需掌握jQuery的核心操作。 通过$符号作为接口,jQuery能够迅速选取DOM组件,例如$("#id")用于选取具有特定ID的元素,而$(".class")则能选取所有应用了某类class的元素。 在选定元素之后,可以执行多种行为,诸如事件监听、样式的变更、内容的更新以及动画的制作等。 关于“一个基于jQuery的图片自动播放功能”,首要任务是准备一组图片素材,这些素材将被整合至一个容器元素之中。 例如,可以构建一个div元素,将其宽度设定为单张图片的尺寸,再借助CSS实现溢出内容的隐藏,从而构建出水平滚动的初始框架。 ```html<div id="slider"> <img src="image1.jpg" alt="Image 1"> <img src="image2.jpg" alt="Image 2"> <!-- 更多图片内容... --></div>```接着,需要编写jQuery脚本以实现图片的自动切换。 这通常涉及到定时器的运用,以设定周期性间隔自动更换当前显示的图片。 通过使用`.fadeOut()`和`.fadeIn()`方法,能够实现图片间的平滑过渡,增强视觉效果。 ```javascript$(document).re...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值