《程序员》2008年第2期"算法擂台" - 微积分习题解答
2008-02-22 12:45
363 查看
小王是大一的学生,想在寒假里强化一下微积分课程的学习,他从图书馆借了一套吉米多维奇的数学分析习题集。他决定在以后的n天里要做完上面的S道积分题。
为了能够尽快地完成任务,小王强迫自己第i天至少要做ai道积分题。但是,小王在假期里还有其他事情(例如过春节),每天的题量不能太多,他估计了一下,第i天做的积分题不能超过bi(bi>=ai)道。
现在小王想知道,究竟能有多少种方案能够在n天里做完这S道习题呢?小王请你写个程序帮他算一算。
具体来说,一个方案就是每天做的微积分题的数目的序列,假设第i天完成xi道题(xi当然满足ai<=i<=bi,且X1+X2+……+Xn=S)。那么向量(X1,X2,…,Xn)就对应了一个方案。两个方案不同是指他们对应的向量不同。
【输入】
一共n+1行,第一行是两个整数n和S,用空格分开,分别表示天数和题目数(1<=n<=20,1<=S<=1000);接下来n行每行两个整数,之间用空格隔开,分别表示第i天对做题数量的限制ai和bi(0<=ai<=bi<=S)。
【输出】
一个整数,表示满足的条件的方案数T.
【输入输出】
解答:
using System;
static class Program
{
static void Main()
{
Console.WriteLine("Result:" + Calc());
Console.Read();
}
static int Calc()
{
int n, s, count = 0, lineCount = 0;
string[] ns = Console.ReadLine().Split(' ');
n = int.Parse(ns[0]);
s = int.Parse(ns[1]);
int[,] ai =new int[n, 3];
while (lineCount < n)
{
string[] aibi = Console.ReadLine().Split(' ');
ai[lineCount, 0] = int.Parse(aibi[0]);
ai[lineCount, 1] = int.Parse(aibi[1]);
ai[lineCount, 2] = ai[lineCount, 0];
lineCount++;
}
Console.WriteLine("Wait...");
while (true)
{
int sum = 0;
for (int i = 0; i < n; i++)sum += ai[i, 2];
if (sum == s)count++;
for (int i = n - 1; i >= 0; i--)
{
if (ai[i, 2] < ai[i, 1])
{
ai[i, 2]++;
break;
}
else
{
ai[i, 2] = ai[i, 0];
if(i==0)return count;
}
}
}
}
}
为了能够尽快地完成任务,小王强迫自己第i天至少要做ai道积分题。但是,小王在假期里还有其他事情(例如过春节),每天的题量不能太多,他估计了一下,第i天做的积分题不能超过bi(bi>=ai)道。
现在小王想知道,究竟能有多少种方案能够在n天里做完这S道习题呢?小王请你写个程序帮他算一算。
具体来说,一个方案就是每天做的微积分题的数目的序列,假设第i天完成xi道题(xi当然满足ai<=i<=bi,且X1+X2+……+Xn=S)。那么向量(X1,X2,…,Xn)就对应了一个方案。两个方案不同是指他们对应的向量不同。
【输入】
一共n+1行,第一行是两个整数n和S,用空格分开,分别表示天数和题目数(1<=n<=20,1<=S<=1000);接下来n行每行两个整数,之间用空格隔开,分别表示第i天对做题数量的限制ai和bi(0<=ai<=bi<=S)。
【输出】
一个整数,表示满足的条件的方案数T.
【输入输出】
样例A | 样例B | 样例C | 样例D | |
输入样例 | 3 11 2 5 1 6 3 4 | 8 20 1 4 2 8 1 5 2 7 4 7 2 5 2 8 1 3 | 10 55 0 1 0 2 0 3 0 4 0 5 0 8 0 8 0 8 0 9 0 10 | 15 123 1 100 2 100 3 100 4 100 5 100 6 100 7 100 8 100 9 100 10 100 11 100 12 100 13 100 14 100 15 100 |
输出样例 | 8 | 731 | 209 | 680 |
using System;
static class Program
{
static void Main()
{
Console.WriteLine("Result:" + Calc());
Console.Read();
}
static int Calc()
{
int n, s, count = 0, lineCount = 0;
string[] ns = Console.ReadLine().Split(' ');
n = int.Parse(ns[0]);
s = int.Parse(ns[1]);
int[,] ai =new int[n, 3];
while (lineCount < n)
{
string[] aibi = Console.ReadLine().Split(' ');
ai[lineCount, 0] = int.Parse(aibi[0]);
ai[lineCount, 1] = int.Parse(aibi[1]);
ai[lineCount, 2] = ai[lineCount, 0];
lineCount++;
}
Console.WriteLine("Wait...");
while (true)
{
int sum = 0;
for (int i = 0; i < n; i++)sum += ai[i, 2];
if (sum == s)count++;
for (int i = n - 1; i >= 0; i--)
{
if (ai[i, 2] < ai[i, 1])
{
ai[i, 2]++;
break;
}
else
{
ai[i, 2] = ai[i, 0];
if(i==0)return count;
}
}
}
}
}
相关文章推荐
- 《程序员》2008年第1期"算法擂台" - Cantor表解答
- 《程序员》2008年第1期"算法擂台" - Cantor表解答
- 《程序员》2008年第1期"算法擂台" - Cantor表解答
- 2008年06期算法擂台解答
- 程序员杂志07年12月算法擂台时间表达的解答
- Qt实现"颜色减淡"算法
- "2个面试华为光网测试的有关算法题",我写的程序!!!
- c++实现"四分位数"算法1
- 程序员的七宗"罪"
- "每个Y的最新X"算法,not exists妙用
- 程序员之---C语言细节12(指针和数组细节,"//"的可移植性说明)
- [转贴]"女程序员"代码...竟然还有增强版...
- 我看Buddy(伙伴)算法-到底是怎么"找朋友"的
- 作为程序员学习--"重要"之我见
- 说说程序员"必备技术"
- 程序员为什么单身?细数程序员"六宗罪"
- 算法_请用代码来计算字符串"I'm go to swimming"中每一个字母出现的次数,并打印出来
- 小汇编习题"HELLO?"
- 杉山恭子,2008年"日本美女"选美比赛结果揭晓(组图)
- cannot open include file"afxres.h" 的解答