| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
不会系列,还是贴个代码 :需要使用K倍动态减法#include<stdio.h>
#include<string.h>
#include<string>
#include<algorithm>
#include<queue>
#define Max 1000010
#define inf 0x3f3f3f3f
using namespace std;
int max(int x,int y) {if(x>y) return x;return y;}
int min(int x,int y) {if(x>y) return y;return x;}
int a[Max]; //a[i] 为当前构造的项
int b[Max]; //b[i]+1为下一项
int main()
{
int n,k,t,m,i,j,ans;
scanf("%d",&m);
for(int mm=1;mm<=m;mm++)
{
scanf("%d%d",&n,&k);
a[0]=b[0]=1;
i=j=0;//i是现在的位置,j是能否和p成k倍关系的数
while(n>a[i])
{
i++;
a[i]=b[i-1]+1;
while(a[j+1]*k<a[i]) //找到第一个k倍大于现在数的数
{
j++;
}
if(k*a[j]<a[i]) //如果存在k倍大于当前
b[i]=b[j]+a[i];
else
b[i]=a[i]; //主要用来构造前面几项
}
if(n==a[i])
ans=-1;
else
{
while(n)//每个数都可以变成该数列的数相加,我们依次相减
{
if(n>=a[i])
{
n-=a[i];
ans=a[i];
}
i--;
}
}
printf("Case %d: ",mm);
if(ans==-1)
printf("lose\n");
else
printf("%d\n",ans);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator