每日刷题(九十九)
有几个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;
一直报错,找了半天终于发现了,唉