uvalive2222(等差序列前n项求和)

题意:

有n个点,每个点高度不一样但一定要在0以上;

而且除了头尾两个点.任意点的高度是前后两个点相加除以2 再减1;

给出最左端的A点高度;求最右端的B点高度最低多少;

思路:

首先由任意点的高度是前后两个点相加除以2 再减1;

我们可以的出;

两个线段的长度差一定是2;

那么我们就可以用等差序列求和来做;

a1 * n + n * (n - 1) * d /2   (因为d = 2,所以d /2可以去掉),a1从0那个点开始上升曲线第一段线段的长度;

现在我们要让左边下降曲线的点尽量多,这样右边上升曲线点就少,B就低;

我们知道A的高度H;

那么a1 * n + n * (n - 1) = H;

那么a1 =( H - n * (n - 1) ) / n;

所以我们要枚举左边的线段有几段;知道有几段,就知道a1是多少,如果n太大会导致a1是负数;所以我们要求a1整数时最大的n;

那么总的线段数 - n就是上升曲线的线段数;并且上升曲线的第一段长度也知道,因为它加上a1要等于2,这样2/2 - 1才会是0;

但是如果算出来下降曲线的线段数就是总线段数,世界输出0;

#include<cstdio>
#include<cstring>
#include<cmath>

const int N = 1005;
double n;
double A;

int main() {
	while(scanf("%lf%lf",&n,&A) == 2) {
		double i;
		double a1;
		for(i = n - 1.0; fabs(i - 2) > 1e-9; i -= 1.0) {
			if((A - i * (i - 1)) / i > 0) {
				a1 = (A - i * (i - 1)) / i;
				break;
			}
		}
		if(fabs(i - (n - 1.0)) < 1e-9) {
			printf("0.00\n");
		}else {
			a1 = 2.0 - a1;
			n = (n - 1.0 - i);
			printf("%.2lf\n",a1 * n + n * (n - 1.0));
		}
	}
}
时间: 2024-08-29 11:43:20

uvalive2222(等差序列前n项求和)的相关文章

循环-26. 求给定序列前N项和之四

循环-26. 求给定序列前N项和之四(15) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 来源 ZOJ 本题要求编写程序,计算序列 1 - 1/4 + 1/7 - 1/10 + ... 的前N项之和. 输入格式: 输入在一行中给出一个正整数N. 输出格式: 在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后3位.题目保证计算结果不超过双精度范围. 输入样例: 10 输出样例: sum = 0.819 1 #incl

循环-28. 求给定序列前N项和之六

循环-28. 求给定序列前N项和之六(15) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 来源 ZOJ 本题要求编写程序,计算序列 2^1 + 22 + 23 + ... 的前N项之和. 输入格式: 输入在一行中给出一个不超过30的正整数N. 输出格式: 在一行中按照“sum = S”的格式输出部分和的整数值S. 输入样例: 5 输出样例: sum = 62 1 #include<stdio.h> 2 #include<ma

循环-25. 求给定序列前N项和之三

循环-25. 求给定序列前N项和之三(15) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 来源 ZOJ 本题要求编写程序,计算序列 1 + 1/3 + 1/5 + ... 的前N项之和. 输入格式: 输入在一行中给出一个正整数N. 输出格式: 在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位.题目保证计算结果不超过双精度范围. 输入样例: 23 输出样例: sum = 2.549541 1 #include<

循环-24. 求给定序列前N项和之二

循环-24. 求给定序列前N项和之二(15) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 来源 ZOJ 本题要求编写程序,计算序列 1! + 2! + ... 的前N项之和. 输入格式: 输入在一行中给出一个不超过12的正整数N. 输出格式: 在一行中输出整数结果. 输入样例: 5 输出样例: 153 1 #include<stdio.h> 2 #include<math.h> 3 #include<stdlib

循环-10. 求序列前N项和(15)

本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和.注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子. 输入格式: 输入在一行中给出一个正整数N. 输出格式: 在一行中输出部分和的值,精确到小数点后2位.题目保证计算结果不超过双精度范围. 输入样例: 20 输出样例: 32.66 #include <iostream> #include <stdio.h> using namespace std; int main(){ i

循环-10. 求序列前N项和

1 /* 2 * Main.c 3 * C10-循环-10. 求序列前N项和 4 * Created on: 2014年7月30日 5 * Author: Boomkeeper 6 *******部分通过******* 7 */ 8 9 #include <stdio.h> 10 11 int main(void) { 12 13 double sum = 0.0; //记录前N项和 14 int numerator = 2,denominator = 1; //分子分母 15 int N;

浙大版《C语言程序设计(第3版)》题目集 练习2-13 求N分之一序列前N项和 (15 分)

练习2-13 求N分之一序列前N项和 (15 分) 本题要求编写程序,计算序列 1 + 1/2 + 1/3 + ... 的前N项之和. 输入格式: 输入在一行中给出一个正整数N. 输出格式: 在一行中按照"sum = S"的格式输出部分和的值S,精确到小数点后6位.题目保证计算结果不超过双精度范围. 输入样例: 6 输出样例: sum = 2.450000 思路:每次循环分母加一. 代码如下: #include<stdio.h> int main() { int i, n,

浙大版《C语言程序设计(第3版)》题目集 练习2-14 求奇数分之一序列前N项和 (15 分)

练习2-14 求奇数分之一序列前N项和 (15 分) 本题要求编写程序,计算序列 1 + 1/3 + 1/5 + ... 的前N项之和. 输入格式: 输入在一行中给出一个正整数N. 输出格式: 在一行中按照"sum = S"的格式输出部分和的值S,精确到小数点后6位.题目保证计算结果不超过双精度范围. 输入样例: 23 输出样例: sum = 2.549541 思路:每次循环分母加二.代码如下: #include<stdio.h> int main() { int i, n

浙大版《C语言程序设计(第3版)》题目集 习题2-6 求阶乘序列前N项和 (15 分)

习题2-6 求阶乘序列前N项和 (15 分) 本题要求编写程序,计算序列 1!+2!+3!+? 的前N项之和. 输入格式: 输入在一行中给出一个不超过12的正整数N. 输出格式: 在一行中输出整数结果. 输入样例: 5 输出样例: 153 思路:利用函数阶乘累加. 代码如下: #include <stdio.h> long factorial(long n); int main() { long n; scanf("%ld",&n); printf("%l