题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5312
For example,
10 1 2 3 4 5 6 7 8 22 10
1 2 3 4 5 6 1 2 4 4
(序列中的没一个数能够使用若干次)
详见代码 。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int a[100005];
bool check1(int m)
{
for (int i=1; i<20010; i++)
{
if (a[i]==m)
return 1;
}
return 0;
}
bool check2(int m)
{
int j;
for (int i=1,j=20010-1; i<20010&&a[i]<m; i++)
{
while (a[i]+a[j]>m)
j--;
if (a[i]+a[j]==m)
return 1;
}
return 0;
}
int main()
{
for (int i=0; i<20010; i++)
{
a[i]=3*i*(i-1)+1;
}
int t;
scanf("%d",&t);
while (t--)
{
int m;
scanf("%d",&m);
int flag=0;
if (check1(m))
{
printf ("1\n");
continue;
}
else if (check2(m))
{
printf ("2\n");
continue;
}
else
{
for (int i=3; i<=8; i++) //循环到8的原因是由于模6的余数仅仅有0-5六个
{
if ((m-i)%6==0)
{
printf ("%d\n",i);
flag=1;
break;
}
}
}
if (flag==0)
{
printf ("-1\n");
}
}
return 0;
}
原文:http://www.cnblogs.com/mfmdaoyou/p/6935223.html