《程序员》2008年第2期"算法擂台" - 微积分习题解答

本文介绍了一个解决学生在限定时间内完成特定数量微积分习题的问题。通过编写程序来计算在给定条件下可能的做题方案数目,帮助学生合理安排学习计划。

         小王是大一的学生,想在寒假里强化一下微积分课程的学习,他从图书馆借了一套吉米多维奇的数学分析习题集。他决定在以后的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行,第一行是两个整数nS,用空格分开,分别表示天数和题目数(1<=n<=201<=S<=1000);接下来n行每行两个整数,之间用空格隔开,分别表示第i天对做题数量的限制aibi(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;
                }
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值