(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;
}
(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;
}
(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;
}
(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)代码:
(1)问题描述:
(2)要点:树链剖分问题
(3)代码:参考这里