北向眼


私信TA

用户名:uq_91541132464

访问量:2598

签 名:

题解都是为了做笔记,备战中

等  级
排  名 1964
经  验 2535
参赛次数 1
文章发表 15
年  龄 20
在职情况 学生
学  校 江西财经大学
专  业 软件工程

  自我简介:

题解都是为了做笔记,备战中 //更新,javaB国一已拿,转战Acwing

import java.io.*;

public class Main {
	static BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
	public static void main(String[] args) throws IOException {
		while(true) {
//			存入数据
			int T=Integer.parseInt(bf.readLine());
			if(T==0) break;
			String[] s=bf.readLine().split(" ");
			double[] CF=new double[T+1];
			for(int i=0;i<=T;i++) {
				CF[i]=Integer.parseInt(s[i]);
			}
			double L=-1;
			double R=9999;
			for(int i=0;i<100;i++) {
				double IRR=(L+R)/2;
				double sum=0;
				double now=1;
				for(int j=0;j<=T;j++) {
					sum+=CF[j]/now;
					now*=(1+IRR);
				}
				if(sum>0) {
					L=IRR;
				}else{
					R=IRR;
				}
				if(L==R) break;
			}
			pw.printf("%.2f\n",R);
			
		}
		pw.flush();
	}	
}

解题思路:

    看到这类求方程的题目,应先想到二分,观察一下NPV函数,发现IRR增加,NPV递减,严谨一些,对函数进行求导,发现这个函数单调递减。二分法,最关键的是找到上下限,根据题目意思,这道题的范围为(-1,无穷),(额。。。其实这道题说的有点问题吧阿sir!!!)。

    然后找到之后呢,得到中间值,如果取得的值大于0,那就是IRR小了,因为IRR越大函数越小嘛,那就把左边的范围减小,L设为当前值,反之亦然,为什么循环100次,为什么L和R相等就退出呢,看注意事项中。

    找到了输出一下就行了  ,注意两位小数哦

注意事项:

    1、快读快写获得值,不要小看快读快写,能快将近两倍

    2、为什么循环100次,L等于R退出,因为double的精确度太高!,题目只需要两位,所以给定一个循环次数的最大值,当上限和下限相等的时候就退出
    

 

0.0分

3 人评分

  评论区

  • «
  • »