NOIP 1998 上下车问题 解题报告
看到一个很好的结题报告,转一下:http://zhurui250.blog.163.com/blog/static/13727052020115273939197/
【分析】数学推论题,我列一下
站数 1 2 3 4 5 6 …… N
上车人数 A F A+F A+2F 2A+3F 3A+5F …… 0
下车人数 0 F F A+F A+2F 2A+3F …… M
总人数 A A 2A 2A+F 3A+2F 4A+4F …… 0
代码:
#include <stdio.h>
#include <stdlib.h>
struct post{
int a, x;
}s1[21], s2[21], s3[21];
//s1 是上车人数
//s2 是下车人数
//s3 是总人数
int main(int argc, char **argv)
{
int i, u;
int a, n, m, x;
scanf("%d%d%d%d", &a, &n, &m, &x);
s1[1].a = 1;
s1[2].x = 1;
s2[2].x = 1;
s3[1].a = 1;
s3[2].a = 1;
for(i = 3; i < n; i++){
s1[i].a = s1[i - 1].a + s1[i - 2].a;
s1[i].x = s1[i - 1].x + s1[i - 2].x;
s2[i].a = s1[i - 1].a;
s2[i].x = s1[i - 1].x;
s3[i].a = s3[i - 1].a + s1[i].a - s2[i].a;
s3[i].x = s3[i - 1].x + s1[i].x - s2[i].x;
}
if((m - s3[n - 1].a * a) % s3[n - 1].x != 0){
printf("No answer.\n");
return 0;
}
u = (m - s3[n - 1].a * a) / s3[n - 1].x;
printf("%d\n", s3[x].a * a + s3[x].x * u);
return 0;
}
浙公网安备 33010602011771号