(1)问题描述:给定两个字符串A和B,问是否能够从A和B中各自取得一个非空子串,使得他们连接之后为回文字符串。
(2)要点:若两个字符串存在相同字母,则可以构成回文子串;否则不行。
(3)代码:
#include <stdio.h>
#include <assert.h>
#include <vector>
#include <algorithm>
#include <string.h>
using std::vector;
int main()
{
static const size_t charset_size = 26;
static const size_t buff_size = 1000;
char abuff[buff_size+1] = { 0 },bbuff[buff_size+1] = { 0 };
unsigned int nCases = 0;scanf("%d",&nCases);
for(unsigned int iCases = 1;iCases <= nCases;++iCases)
{
scanf("%s%s",abuff,bbuff);
bool aexist[charset_size] = { 0 },bexist[charset_size] = { 0 };
for(size_t i = 0,len = strlen(abuff);i < len;++i) aexist[abuff[i]-'a'] = true;
for(size_t i = 0,len = strlen(bbuff);i < len;++i) bexist[bbuff[i]-'a'] = true;
bool ans = false;
for(size_t i = 0;i < charset_size;++i) ans |= (aexist[i] && bexist[i]);
printf("%s\n",ans?"Yes":"No");
}
return 0;
}
(1)问题描述:给定两个相同大小的数组A和B,允许对A中的某个元素加1或者减1,最多K次,问sum(A[i]*B[i])的最大值是多少
(2)要点:对B[i]对应的A[i]增加k次或者对B[i]最小的A[i]减少K次
(3)代码:
#include <stdio.h>
#include <assert.h>
#include <vector>
#include <algorithm>
#include <string.h>
using std::vector;
// (a+1)*b => b
// (a-1)*b => -b
int main()
{
unsigned int nCases = 0;scanf("%d",&nCases);
for(unsigned int iCases = 1;iCases <= nCases;++iCases)
{
unsigned int n = 0,k = 0;scanf("%d%d",&n,&k);
vector<int> adata(n,0),bdata(n,0);
for(unsigned int i = 0;i < n;++i) scanf("%d",&adata[i]);
for(unsigned int i = 0;i < n;++i) scanf("%d",&bdata[i]);
long long ans = 0,delta = 0;
int minv = 0,maxv = 0;
for(unsigned int i = 0;i < n;++i)
{
long long t = adata[i];
t *= bdata[i];ans += t;
if(maxv < bdata[i]) maxv = bdata[i];
if(minv > bdata[i]) minv = bdata[i];
}
if(maxv >= 0) //
{
if(minv >= 0) { delta = maxv;delta *= k; }
else if(maxv < 0 - minv) { delta = 0 - minv;delta *= k; }
else { delta = maxv;delta *= k; }
}
else
{
delta = 0 - minv;delta *= k;
}
printf("%lld\n",ans+delta);
}
return 0;
}