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; }