期末复习笔记 | PTA数据结构上机题(持续更新)

写在前面 : 这个算是个破烂集叭,没什么参考的意义,单纯的写给自己。因为即使很简单的题,也会有一些错误的发生,同事抱着不想因小失大的想法,将这些错误记录下来,免得日后再发生。(日后一定会再发生(大雾)

1: 一道简单的dp, 要求求出一个序列中的最大子段和,我们定义dp[i]为以i结尾的最大子段和,列出转移方程即可。

#include
#include
#include
using namespace std;

const int maxn = 1e5 + 9;
int a[maxn],dp[maxn];

int main()
{
	int K;
	scanf("%d",&K);
	for(int i = 0;i < K;i++)
	{
		scanf("%d",&a[i]);
	}
	dp[0] = a[0];
	for(int i = 1;i < K;i++)
	{
		dp[i] = max(dp[i-1] + a[i],a[i]);
 	}
	int maxx = 0;
	for(int i = 0;i < K;i++)
	{
		maxx = max(maxx ,dp[ i ]);
	}
	printf("%d\n",maxx);
	return 0;
} 

2:一元多项式的加法与乘法
真的是一道很没有思维水平的模拟题,但是我却写了好长时间(主要是debug),再一次反映了自己代码水平不过关的残忍事实qwq。不过这原生代码虽然看起来长,但是比网上千篇一律的解法要更省空间(不得不吐槽做完之后看了10篇blog都是一模一样的解法,俺佛了)。

怎么说呢:要注意模拟题在写之前就要尽量考虑好所有的情况,不然最后debug仿佛补补丁,使得代码可读性特别差。
不知道这一题是不是用链表写会更简单,但是我选择了我用的更熟练的数组qwq

#include
#include
using namespace std;

const int maxn = 1e5 + 9;

struct node
{
	int xi;
	int eps;
};
bool cmp(node a,node b)
{
	return a.eps > b.eps;
}

node eq1[maxn];
node eq2[maxn];
node jia[maxn];
node cheng[maxn];
node ch[maxn];

int main()
{
	//freopen("input.txt","r",stdin);
	int num1,num2;
	scanf("%d",&num1);
	for(int i = 0;i < num1; i++)
	{
		scanf("%d%d",&eq1[i].xi,&eq1[i].eps);
	}
	scanf("%d",&num2);
	for(int i = 0;i < num2;i++)
	{
		scanf("%d%d",&eq2[i].xi,&eq2[i].eps);
		jia[i].xi = eq2[i].xi;
		jia[i].eps = eq2[i].eps;
		
	}
	//---------------------------------------------
	int ct = 0;
	for(int i=0;i<num1;i++)
	{
		for(int j=0;j<num2;j++)
		{
			cheng[ct].xi = eq1[i].xi * eq2[j].xi;
			cheng[ct].eps = eq1[i].eps + eq2[j].eps;
			ct++;
		}
	}
	sort(cheng,cheng+ct,cmp);
	//printf("---%d\n",ct);
	int temp = 0;
	ch[0].xi  = cheng[0].xi;
	ch[0].eps = cheng[0].eps;
	for(int i=1;i<ct;i++)
	{
		while(cheng[i].eps == ch[temp].eps)
		{
			ch[temp].xi += cheng[i].xi;
			i++;
		}
		temp++;
		ch[temp].xi = cheng[i].xi;
		ch[temp].eps = cheng[i].eps;
	}
	int cnt_0 = 0;
	for(int i = 0 ;i <= temp;i++)
	{
		if(ch[i].xi == 0) cnt_0++;
	}
	if(cnt_0 == temp + 1) 
	{
		printf("0 0\n");
	}
	else
	 {
		for(int i = 0;i <= temp;i++)
		{
		if(i != temp)
		{
			if(ch[i].xi!=0)
			{
				if(i!=0) printf(" ");
				printf("%d %d",ch[i].xi,ch[i].eps);
			}
			
		}
		else
		{
			if(ch[i].xi!=0)
			{
				if(i!=0) printf(" ");
				printf("%d %d",ch[i].xi,ch[i].eps);
			}
			
		}
	}
	printf("\n");
	}

	//------------------------------------------------------
	int cnt_jia = num2;
	int cnt = num2;
	for(int j = 0;j < num1;j++)
	{
		int flag = 0;
		for(int i = 0;i < cnt_jia;i++)
		{
			if(jia[i].eps == eq1[j].eps)
			{
				jia[i].xi = jia[i].xi + eq1[j].xi;
				flag = 1;
			}
		}
		if(flag == 0)
		{
			jia[cnt].xi = eq1[j].xi;
			jia[cnt].eps = eq1[j].eps;
			cnt++;
		}
	}
	sort(jia,jia + cnt,cmp);
	/*printf("----------\n"); 
	for(int i=0;i
	// remember to take all 0 into consideration
	int count = 0;
	for(int i=0;i<cnt;i++)
	{
		if(jia[i].xi == 0)
		count++;
	}
	if(count == cnt)
	{
		printf("0 0\n");
		return 0;
	}
	for(int i = 0;i < cnt ;i++)
	{
		if(i != cnt-1)
		{
			if(jia[i].xi !=0 )
			{
				if(i!=0) printf(" ");
				printf("%d %d",jia[i].xi,jia[i].eps);
			}
			
		}
		else
		{
			if(jia[i].xi !=0 )
			{
				if(i!=0) printf(" ");
				printf("%d %d",jia[i].xi,jia[i].eps);
			}
				
		}
	}
	return 0;
}


/*一些总结:
有一说一,自己是真的没想到这么简单地一道题能写这么久,有这么多bug */

7:六度分离
一道图论题
有一说一,如果按题目所给的数据范围,n <= 1e3 是完全不能跑Floyd的,且因为他的边并没有很多,所以标程应该是每个点跑一遍堆优化的dij。
但是呢问题来了qwq,我比较懒,所以就写了一个Floyd扔上去准备看着大大的tle令我死心,结果,AC???
n3过一千,怕是光速测评机哈哈。

#include
#include
#include
using namespace std;
 
 
const int maxn = 1e3 + 9;
 
int maze[maxn][maxn] = { 0 };

int n,m;

int main()
{
	scanf("%d%d",&n,&m);	
	memset(maze,0x3f3f3f,sizeof(maze));
	while(m--)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		maze[a][b] = 1;
		maze[b][a] = 1;
	}

	for(int k =1;k <= n;k++)
	{
		for(int i = 1;i <= n;i++)
		{
			for(int j = 1;j <= n;j++)
			{
				maze[i][j] = min(maze[i][j],maze[i][k] + maze[k][j]);
			}
		}
	}
	
	int cnt[maxn];
	memset(cnt,0,sizeof cnt);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(maze[i][j] <= 6)
			{
				cnt[i]++;
				cnt[j]++;
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		printf("%d: %.2f%\n",i,100.0*cnt[i]/(2.0*n));
	}
	return 0;
}

你可能感兴趣的:(复习)