CodeChef2016年09月问题

LONGSEQ

(1)问题描述:给定一个01串,问能否通过修改一个数字使得变为全0或者全1

(2)要点:

(3)代码:

#include <stdio.h>
#include <string.h>

int main()
{
	static const size_t buff_size = 100000;
	char buff[buff_size+1] = { 0 };
	unsigned int nCases = 0;scanf("%d",&nCases);
	for(unsigned int iCases = 1;iCases <= nCases;++iCases)
	{
		scanf("%s",buff);
		size_t count0 = 0,count1 = 0;
		for(size_t i = 0;i < strlen(buff);++i)
		{
			count0 += ('0' == buff[i]);
			count1 += ('1' == buff[i]);
		}
		bool ans = false;
		if(count0 == 1) ans = true;
		else if(count1 == 1) ans = true;
		printf("%s\n",ans?"Yes":"No");
	}
	return 0;
}


LEXOPAL

(1)问题描述:给定一个字符串,其中有部分字符不确定,求最小的回文串

(2)要点:

(3)代码:

#include <stdio.h>
#include <string.h>

int main()
{
	static const size_t buff_size = 100000;
	char buff[buff_size+1] = { 0 };
	unsigned int nCases = 0;scanf("%d",&nCases);
	for(unsigned int iCases = 1;iCases <= nCases;++iCases)
	{
		scanf("%s",buff);
		bool ok = true;
		for(size_t i = 0,len = strlen(buff);i <= len - 1 - i;++i)
		{
			char c = buff[i],ch = buff[len-1-i];
			if(c == '.' && ch == '.') buff[i] = 'a',buff[len-1-i] = 'a';
			else if(c == '.') buff[i] = ch;
			else if(ch == '.') buff[len-1-i] = c;
			else if(c != ch) ok = false;
		}
		if(ok) printf("%s\n",buff);
		else printf("-1\n");
	}
	return 0;
}


RESCALC

(1)问题描述:

(2)要点:贪心

(3)代码:

#include <stdio.h>
#include <vector>
#include <algorithm>

using std::vector;

int main()
{
	static const size_t type_size = 6;
	unsigned int nCases = 0;scanf("%d",&nCases);
	for(unsigned int iCases = 1;iCases <= nCases;++iCases)
	{
		unsigned int n = 0;scanf("%d",&n);
		vector<unsigned int> score(n,0);
		for(unsigned int i = 0;i < n;++i)
		{
			unsigned int m = 0,t = 0;scanf("%d",&m);
			score[i] = m;
			unsigned int counts[type_size] = { 0 };
			for(unsigned int k = 0;k < m;++k)
			{
				scanf("%d",&t);
				++counts[t-1];
			}
			std::sort(counts,counts+type_size);
			score[i] += counts[0]*4 + (counts[1] - counts[0])*2 + (counts[2] - counts[1]);
		}
		unsigned int imax = 0,tie = 0;
		for(size_t i = 1;i < n;++i)
		{
			if(score[i] > score[imax]) imax = i,tie = 0;
			else if(score[i] == score[imax]) tie = 1;
		}
		if(0 != tie) printf("tie\n");
		else if(0 == imax) printf("chef\n");
		else printf("%u\n",imax+1);
	}
	return 0;
}



CHFNFRN

(1)问题描述:

(2)要点:2SAT问题

(3)代码:

#include <stdio.h>
#include <vector>
#include <algorithm>

using std::vector;

int main()
{
	static const size_t maxn = 1000;
	unsigned int nCases = 0;scanf("%d",&nCases);
	for(unsigned int iCases = 1;iCases <= nCases;++iCases)
	{
		unsigned int n = 0,m = 0;scanf("%d%d",&n,&m);
		vector< vector<bool> > g(n,vector<bool>(n,false));
		for(unsigned int i = 0;i < m;++i)
		{
			unsigned int x = 0,y = 0;scanf("%d%d",&x,&y);
			g[x-1][y-1] = true;
			g[y-1][x-1] = true;
		}
		CSat2Fastest<maxn> sf;
		sf.init(n);
		for(unsigned int i = 0;i < n;++i)
		{
			for(unsigned int k = i + 1;k < n;++k)
			{
				if(!g[i][k]) sf.xor1(i,k);
			}
		}
		bool ans = sf.solve();
		printf("%s\n",ans?"YES":"NO");
	}
	return 0;
}



(1)问题描述:

(2)要点:线段树

(3)代码:


JTREE

(1)问题描述:

(2)要点:树链剖分问题

(3)代码:参考这里


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值