2.19C语言学习

P8597 [蓝桥杯 2013 省 B] 翻硬币

因为把相邻两个硬币翻转两次相当于不翻,所以最优方案中同一组硬币最多只会翻转一次,故翻转顺序无后效性,考虑贪心:从前往后比较,发现一个不同的硬币就把它和他后面的硬币翻转,计数器累加,这样最后累加结果一定是最优方案的次数。

#include<bits/stdc++.h>
using namespace std;
char a[1009],b[1009];
int main(){
	scanf("%s",a);
	scanf("%s",b);
	int n=strlen(a);
	int cnt=0;
	for(int i=0;i<n;i++){
		if(a[i]!=b[i]){
			cnt++;
			a[i]=b[i];
			if(a[i+1]=='o')a[i+1]='*';
			else a[i+1]='o';
		}
	}
	printf("%d",cnt);
	return 0;
}

P8637 [蓝桥杯 2016 省 B] 交换瓶子

和上面那道题有点类似,都是交换,这个也是贪心的思路

读入并遍历瓶子的序列,如果该瓶子位置正确可以直接忽视,如果不对,答案加一,往后扫,扫到对应位置的瓶子就交换位置,然后下一个瓶子继续

#include<bits/stdc++.h>
using namespace std;
int a[10009];
int main(){
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		if(a[i]!=i){
			for(int j=i;j<=n;j++){
				if(a[j]==i){
					int temp=a[j];
					a[j]=a[i];
					a[i]=temp;
					ans++;
					break;
				}
			}
		}
	}
	printf("%d",ans);
	return 0;
}

P1434 [SHOI2002] 滑雪

这题直接dfs会tle,所以要采用记忆化搜索,把每次搜到的点的结果记录下来,下次再经过这个点时可以直接用上次搜到的结果,可以省下许多时间

#include<bits/stdc++.h>
using namespace std;
int maps[111][111],s[111][111],dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
bool use[111][111];
int n,m,cnt;
int dfs(int x,int y){
	if(s[x][y])return s[x][y];
	s[x][y]=1;
	for(int i=0;i<4;i++){
		int xx=x+dx[i],yy=y+dy[i];
		if(xx>0&&yy>0&&xx<=n&&yy<=m&&maps[xx][yy]<maps[x][y]){
			dfs(xx,yy);
			s[x][y]=max(s[x][y],s[xx][yy]+1);
		}
	}
	return s[x][y];
}
int main(){
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			scanf("%d",&maps[i][j]);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cnt=max(cnt,dfs(i,j));
		}
	}
	printf("%d",cnt);
	return 0;
}

邻接矩阵介绍
        邻接矩阵就是利用二维矩阵表示图中各顶点之间的关系,对于有n个顶点的图来说,用n阶方阵来表示该图,其中矩阵元素表示从顶点到之间的边,的大小表示边的权值。如果顶点到没有边,则可以将设置为0或者。

        如下图所示,左边是一个无向图,右边是其对应的邻接矩阵,该图是无权图,因此有边的值都设置为1。

                           

        下面是有向图及其邻接矩阵

                                     

         从上面可见,无向图的邻接矩阵是关于主轴对称的,第i行或第j列就是顶点的度(边数)。图中的边数为"1的个数"/2。对于有向图,由于其具有方向性,因此邻接矩阵一般是不对称的,第i行1的个数是顶点的出度,第i列1的个数是其入度。图的边数等于矩阵中1的个数。

对于带权图来说,只需要将1替换为边的权值即可,下面是带权图及其邻接矩阵。

                          

        其中,表示没有边,可以是一个计算机能够接受的较大的值即可。

总结
        图的邻接矩阵表示的优点: 非常直观,并且容易实现,编写算法也较简便,因而应用较广; 根据矩阵元素Aij=1或0,便于判定两个顶点之间是否有边(弧)相连; 计算顶点的度数,或有向图的入度、出度方便; 计算图的边数算法简单等。

        图的邻接矩阵表示的缺点: 邻接矩阵事实上是一种顺序存储结构,具有顺序结构共有的缺点,比如:只能按最大空间需求申请内存空间、插入和删除顶点复杂等; 空间复杂度高,n个顶点的图,存储邻接矩阵需要n2个单元,如果一个图的顶点数较多,但边(弧)数较少的话--稀疏图,邻接矩阵一样需要n2个存储单元,就太浪费存储空间; 统计图的边数算法虽然简单,用双重循环统计“1”的个数即可,但其时间复杂度为O(n2)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值