CodeChef2016年03月问题

STRPALIN

(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;
}


MAXISUM

(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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值