一、PTA
1.二分查找
题意:
本题要求实现二分查找算法。
函数接口定义:
Position BinarySearch( List L, ElementType X );
其中List结构定义如下:
typedef int Position;
typedef struct LNode *List;
struct LNode {
ElementType Data[MAXSIZE];
Position Last; /* 保存线性表中最后一个元素的位置 */
};
L是用户传入的一个线性表,其中ElementType元素可以通过>、==、<进行比较,并且题目保证传入的数据是递增有序的。函数BinarySearch要查找X在Data中的位置,即数组下标(注意:元素从下标1开始存储)。找到则返回下标,否则返回一个特殊的失败标记NotFound。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
#define NotFound 0
typedef int ElementType;
typedef int Position;
typedef struct LNode *List;
struct LNode {
ElementType Data[MAXSIZE];
Position Last; /* 保存线性表中最后一个元素的位置 */
};
List ReadInput(); /* 裁判实现,细节不表。元素从下标1开始存储 */
Position BinarySearch( List L, ElementType X );
int main()
{
List L;
ElementType X;
Position P;
L = ReadInput();
scanf("%d", &X);
P = BinarySearch( L, X );
printf("%d\n", P);
return 0;
}
/* 你的代码将被嵌在这里 */
样例输入1:
5
12 31 55 89 101
31
样例输出1:
2
样例输入2:
3
26 78 233
31
样例输出2:
0
解题思路:
其实就和数组二分查找一样,这题也没怎么用链表。只是刚开始没明白数据在链表中是怎么存储的,就不知道如何下手,最后看了网上的一个代码,就明白了。
程序代码:
Position BinarySearch( List L, ElementType X ){
int left=1;
int right=L->Last;
while(left<=right){
if(L->Data[(left+right)/2]==X){
return (left+right)/2;
}else{
if(L->Data[(left+right)/2]>X){
right=(left+right)/2-1;
}else{
left=(left+right)/2+1;
}
}
}
return NotFound;
}
2.Maximum Subsequence Sum
题意:
Given a sequence of K integers { N1 , N2 , …, NK }. A continuous subsequence is defined to be { Ni , Ni+1 , …, Nj } where 1≤i≤j≤K. The Maximum Subsequence is the continuous subsequence which has the largest sum of its elements. For example, given sequence { -2, 11, -4, 13, -5, -2 }, its maximum subsequence is { 11, -4, 13 } with the largest sum being 20.
Now you are supposed to find the largest sum, together with the first and the last numbers of the maximum subsequence.
就是求最大子列和,然后输出最大值和首尾的值。
输入:
Each input file contains one test case. Each case occupies two lines. The first line contains a positive integer K (≤10000). The second line contains K numbers, separated by a space.
输出:
For each test case, output in one line the largest sum, together with the first and the last numbers of the maximum subsequence. The numbers must be separated by one space, but there must be no extra space at the end of a line. In case that the maximum subsequence is not unique, output the one with the smallest indices i and j (as shown by the sample case). If all the K numbers are negative, then its maximum sum is defined to be 0, and you are supposed to output the first and the last numbers of the whole sequence.
样例输入:
10
-10 1 2 3 4 -5 -23 3 7 -21
样例输出:
10 1 4
解题思路:
题解参考网址
这题太坑了!!
- 全是负数的时候,要输出0和首尾的数据,结果我刚开始不知道,所以全是负数的点一直错。
- 全是负数和零的时候要输出0 0 0 .
- 最大和前面有零的时候要把零删掉。
经过别人的题解,我终于把自己的代码改对了!!
程序代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5;
const int INF=0x3f3f3f3f;
int a[N];
int main(){
int k;
cin>>k;
int flag=0;//标记全是负数
int flag0=0;//标记有没有零
for(int i=1;i<=k;i++){
cin>>a[i];
if(a[i]>0)
flag=1;
if(a[i]==0)
flag0=1;
}
if(flag==0&&flag0==1){
//全是负数和零
cout<<0<<" "<<0<<" "<<0<<endl;
return 0;