zoukankan      html  css  js  c++  java
  • PTA 程序设计题(数据结构第一章)

    C语言版

    第一题 二分查找

    感觉还好

    Position BinarySearch(List L, ElementType X)
    {
    	// 数组大小
    	// int N = sizeof(L->Data) / sizeof(*L->Data);
    	int start = 1;
    	int end = L->Last;
    	int mid;
    	while (start <= end)
    	{
    		mid = (start + end) / 2;
    		if (L->Data[mid] > X)
    			end = mid - 1;
    		else if (L->Data[mid] < X)
    			start = mid + 1;
    		else
    			return mid;
    	}
    	return NotFound;
    }
    

    第二题 最大子序列和

    方法1

    #include<stdio.h>
    #include<malloc.h>
    int Sum(int A[], int N)
    {
     int maxSum, thisSum;
     maxSum = thisSum = 0;
     for (int i = 0; i < N; i++)
     {
     thisSum = 0;
     for (int j = i; j < N; j++)
     {
     for (int k = i; k <= j; k++)
     thisSum += A[k];
     if (thisSum > maxSum)
     maxSum = thisSum;
     }
     }
     return maxSum;
    }
    int main(void)
    {
     int* a = NULL;
     int N;
     scanf("%d", &N);
     a = (int*)malloc(N * sizeof(int));
     for (int i = 0; i < N; i++)
     {
     scanf("%d", &a[i]);
     }
     printf("%d
    ", Sum(a, N));
    }
    

    方法二

    #include<stdio.h>
    #include<malloc.h>
    int Sum(int A[], int N)
    {
     int maxSum, thisSum;
     maxSum = thisSum = 0;
     for (int i = 0; i < N; i++)
     {
     thisSum += A[i];
     if (thisSum > maxSum)
     {
     maxSum = thisSum;
     }
     else if (thisSum < 0)
     {
     thisSum = 0;
     }
     }
     return maxSum;
    }
    int main(void)
    {
     int* a = NULL;
     int N;
     scanf("%d", &N);
     a = (int*)malloc(N * sizeof(int));
     for (int i = 0; i < N; i++)
     {
     scanf("%d", &a[i]);
     }
     printf("%d
    ", Sum(a, N));
    }
    

    方法四 在线处理

    #include<stdio.h>
    #include<malloc.h>
    #include<time.h>
    clock_t start, endness;
    double duration;
    #define recyle_k 1e7
    int Sum(int A[], int N, int* front, int* end)
    {
     int maxSum, thisSum;
     maxSum = thisSum = 0;
     for (int i = 0; i < N; i++)
     {
     thisSum += A[i];
     if (thisSum > maxSum)
     {
     maxSum = thisSum;
     *end = i;
     }
     else if (thisSum < 0)
     {
     thisSum = 0;
     *front = i + 1;
     }
     }
     return maxSum;
    }
    int main(void)
    {
     int* a = NULL;
     int N;
     int front, end;
     int result;
     scanf_s("%d", &N);
     front = 0, end = N;
     a = (int*)malloc(N * sizeof(int));
     for (int i = 0; i < N; i++)
     {
     scanf_s("%d", &a[i]);
     }
     start = clock();
     for (int i = 0; i < recyle_k; i++)
     {
     result = Sum(a, N, &front, &end);
     }
     endness = clock();
     duration = ((double)(endness - start)) / CLK_TCK / recyle_k;
     printf("消耗时间: %2.6e 
    ", duration);
     printf("最大和: %d
    ", result);
     printf("子序列首尾:[%d, %d]", front, end);
     return 0;
    }
    

    关于 返回子序列首尾,不知道为什么总是不对,吐血

    #include<stdio.h>
    #include<malloc.h>
    
    int Sum(int A[], int N, int* front, int* end)
    {
    	int maxSum = 0, thisSum = 0;
    	int flag = 0, m = 0;  // flag 作为 全负数 标记 + -2 -3 5 0 
    	for (int i = 0; i < N; i++)
    	{
    		thisSum += A[i];
    		if (thisSum < 0)
    		{
    			thisSum = 0;
    		}
    		else if (thisSum > maxSum)
    		{
    			maxSum = thisSum;
    			*end = i;
    		}
    		if (A[i] == 0)
    		{
    			flag = 0;
    			m = i;
    
    		}
    	}
    
    	maxSum = thisSum > maxSum ? thisSum : maxSum;
    	if (maxSum != 0)
    	{
    		thisSum = 0;
    		for (int i = *end; i >= 0 ; i--)
    		{
    			thisSum += A[i];
    			if (maxSum == thisSum)
    			{
    				*front = i;
    			}
    		}
    	}
    	else if (flag)
    	{
    		*front = 0;
    		*end = N;
    	}
    	else {
    		*front = m;
    		*end = m;
    	}
    	return maxSum;
    }
    int main(void)
    {
    	int* a = NULL;
    	int N;
    	int front, end;
    	int result;
    	scanf("%d", &N);
    	front = 0, end = N;
    	a = (int*)malloc(N * sizeof(int));
    	for (int i = 0; i < N; i++)
    	{
    		scanf("%d", &a[i]);
    	}
    	result = Sum(a, N, &front, &end);
    	printf("%d %d %d ", result, front, end);
    	return 0;
    }
    

    暂时先这样吧。纠结

  • 相关阅读:
    Xamarin.FormsShell基础教程(3)Shell项目构成
    Xamarin.FormsShell基础教程(2)创建Shell解决方案
    Xamarin.Forms Shell基础教程(1)
    点击按钮,返回顶部
    三角形(css3)
    改变字体大小的媒体查询代码封装
    将毫秒格式化为分钟和秒 ,并补0
    节流函数
    打乱数组方法
    css使用总结
  • 原文地址:https://www.cnblogs.com/xmdykf/p/12322592.html
Copyright © 2011-2022 走看看