水题找自信——有几个PAT、集合的划分、问题 A: 找x

每日刷题(九十九)

有几个PAT

题目描述

字符串APPAPT中包含了两个单词"PAT",其中第一个PAT是第2位§,第4位(A),第6位(T);第二个PAT是第3位§,第4位(A),第6位(T)。
现给定字符串,问一共可以形成多少个PAT?

输入格式

输入只有一行,包含一个字符串,长度不超过105,只包含P、A、T三种字母。

输出格式

在一行中输出给定字符串中包含多少个PAT。由于结果可能比较大,只输出对1000000007取余数的结果。

输入样例

APPAPT

输出样例

2

思路

我们知道,每一个字母A就对应PAT,那么,我们可以用一个数组存P字母的个数,然后用变量存字母T的个数,从后往前遍历,如果遇到了A,则将现有字母T的个数与此处的存放字母P的数组里的元素相乘,一边遍历,一边记录满足的个数

C代码

#include<cstdio>
#include<cstring>

const int MAXN = 100010;
const int MOD = 1000000007;
char str[MAXN];
int leftNumP[MAXN] = {
    
    0};

int main()
{
    
    
	gets(str);
	int len = strlen(str);
	for(int i = 0; i < len; i++)
	{
    
    
		if(i > 0)
		{
    
    
			leftNumP[i] = leftNumP[i - 1] + 1;
		}
		if(str[i] == 'P')
		{
    
    
			leftNumP[i]++;
		}
	}
	
	int ans = 0, rightNumT = 0;
	for(int i = len - 1; i >= 0; i--)
	{
    
    
		if(str[i] == 'T')
		{
    
    
			rightNumT++;
		}
		else if(str[i] == 'A')
		{
    
    
			ans = (ans + leftNumP[i] * rightNumT) % MOD;
		}
	}
	printf("%d\n", ans);
	return 0;
}

样例运行结果如下:
在这里插入图片描述

集合的划分

题目描述

给定一个由整数组成的集合,集合中的整数各不相同,现在要将它分为两个子集合:
①、这两个子集合的并为原集合、交为空集;
②、同时在两个子集合的元素个数n1与n2之差的绝对值 |n1-n2| 尽可能小的前提下,
要求它们各自的元素之和S1与S2之差的绝对值 |S1-S2| 尽可能大。求这个 |S1-S2| 等于多少。

C代码:

#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<algorithm>

using namespace std;

const int maxn = 100010;
int A[maxn], n;

int randPartition(int A[], int left, int right)
{
    
    
	int p = round(1.0 * rand() / RAND_MAX * (right - left) + left);
	
	swap(A[p], A[left]);
	int temp = A[left];
	
	while(left < right)
	{
    
    
		while(left < right && A[right] > temp)
		{
    
    
			right--;
		}
		A[left] = A[right];
		while(left < right && A[left] <= temp)
		{
    
    
			left++;
		}
		A[right] = A[left];
	}
	A[left] = temp;
	return left;
}

void randSelect(int A[], int left, int right, int K)
{
    
    
	if(left == right)
	{
    
    
		return;
	}
	int p = randPartition(A, left, right);
	int M = p - left + 1;
	if(K == M)
		return;
	if(K < M)
		randSelect(A, left, p - 1, K);
	else
		randSelect(A, p + 1, right, K - M);
}

int main()
{
    
    
	srand((unsigned)time(NULL));
	
	int sum = 0, sum1 = 0;
	scanf("%d", &n);
	for(int i = 0; i < n; i++)
	{
    
    
		scanf("%d", &A[i]);
		sum += A[i];
	}
	
	randSelect(A, 0, n - 1, n / 2);
	for(int i = 0; i < n / 2; i++)
	{
    
    
		sum1 += A[i];
	}
	printf("%d\n", (sum - sum1) - sum1);
	return 0;
}

样例运行结果如下:
在这里插入图片描述

问题 A: 找x

题目描述

输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。

输入

测试数据有多组,输入n(1<=n<=200),接着输入n个数,然后输入x。

输出

对于每组输入,请输出结果。

样例输入

4
1 2 3 4
3

样例输出

2

C++代码

#include<bits/stdc++.h>
using namespace std;

//const int MAXN = 210; 
//int a[MAXN];

int binarySearch(vector<int>& a, int left, int right, int target)
{
    
    
	int mid;
	while(left <= right)
	{
    
    
		mid = (right - left) / 2 + left;		//防溢出 
		if(a[mid] == target)
		{
    
    
			return mid;
		}
		if(a[mid] < target)
		{
    
    
			left = mid + 1;
		}
		else 
		{
    
    
			right = mid - 1;
		}
	}
	return -1;
}

int main()
{
    
    
	int n;
	while(cin >> n)
	{
    
    
		vector<int>a(n);
		for(int i = 0; i < n; i++)
		{
    
    
			cin >> a[i];
		}
		int tar;
		cin >> tar;
		cout << binarySearch(a, 0, n - 1, tar) << endl;
	}
	return 0;
 } 

样例运行结果:
在这里插入图片描述
之前因为

cout << binarySearch(a, 0, n , tar) << endl;

一直报错,找了半天终于发现了,唉

如果喜欢我的文章,请记得三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持,下期更精彩!!!

猜你喜欢

转载自blog.csdn.net/qq_44631615/article/details/113852963