VJ测试题解

A题意:给出两个数组,让你根据题目给出的公式算出结果,最后的结果要是最简分式。
思路:分子分母分开算,模拟一遍,再将分子分母约分(找最大公因数,把他们都除个最大公因数)模拟的顺序是从尾部开始,分子是b[n],分母为a[n],每次都是除式,分子变分母,分母变分子,再把值也相应的变一下
1 1 1
2 3 4
2/(1+3/(1+1/4)): 1:1/4 ,2:12/5,3: 5/4/

#include<iostream>
#include<cstdio>
using namespace std;
int huajian(int a, int b)//求出最大公因数
{
 int c = b;
 while(a%b!=0)
 {
  c = a%b;
  a = b;
  b = c;
 }
 return c;
}
int main()
{
    int t,n,a[100],b[100],tt=0,m=0,z=0;
    cin>>t;
    while(t--){
        tt++;
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        for(int i=1;i<=n;i++)
            cin>>b[i];
            m=a[n];
            z=b[n];
            int tm=m,tz=z;
        for(int i=n-1;i>=1;i--)
        {
             z=m*b[i];//分母变分子并且要乘新增的b[i]
             m=m*a[i]+tz;//分母其实是上次的分子,
             //上次的分子并不完全是tz,还有m*a[i]
             tz=z;//记录上次的分子,用来计算分母
        }
        int s=huajian(z,m);
             z=z/s;
             m=m/s;
        printf("Case #%d: %d %d\n",tt,z,m);
    }
}

B题意:给你一个n(1<=n<=20)求出在n条(1-n)的边中,最少去掉多少条就不能构成三角形。
一开始以为规律没找出来,然后看了只有数据只有20,我就直接把20个情况的都算了一遍,直接就打表出来了

using namespace std;
int a[22]={0,0,0,0,1,1,2,3,3,4,5,6,7,7,8,9,10,11,12,13,14};
int main()
{
    int t,n,ans,tt=0;
    cin>>t;
    while(t--){
        tt++;
        cin>>n;
        printf("Case #%d: %d\n",tt,a[n]);
    }
}

但是正经的解应该是用队列去模拟一遍

    q.push(3);
    q.push(2);//1是不能和别的边组成三角形的,不用管
     k=4;
    while(k<=20)
    {
        n=q.front();
        q.pop();
        m=q.front();
        if(n+m>k)//如果能构成三角形,
        //首先就需要与新加进来的边最接近的边能与他构成三角形
        {
            ans++;
            q.push(n);
            a[k]=ans;
        }
        else
        {
            q.push(k);
            a[k]=ans;
        }
        k++;
    }

C题意:每组给出一个n,求出1/i^2(1<=i<=n)的和
百度一波1-n^2分之一的和最终趋近与 π*π/6:
将sinx按泰勒级数展开:
sinx=x-x3/3!+x5/5!-x^7/7!+ …
于是sinx/x=1-x2/3!+x4/5!-x^6/7!+ …
令y=x2,有sin√y/√y=1-y/3!+y2/5!-y^3/7!+ …
而方程sinx=0的根为0,±π,±2π,…
故方程sin√y/√y=0的根为π²,(2π)²,…
即1-y/3!+y2/5!-y3/7!+…=0的根为π²,(2π)²,…
由韦达定理,常数项为1时,根的倒数和=一次项系数的相反数
即1/π²+1/(2π)²+…=1/3!
故1+1/2²+1/3²+ … =π²/6
相信总有数学大佬能看懂(记住这个规律8QAQ)
其实这题卡了数据,如果>6位数了刚好保留的5位数就等于π^2/6了,不知道规律的也能猜出到后面的值应该会趋近某一个值,然后可以慢慢尝试卡出那个值

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
char a[N];
double sum[N];
int main()
{
    for(int i = 1 ; i < N ; i++)
        sum[i] = sum[i - 1] + (double)1/i/i;
    while(~scanf("%s",a)){
        int l = strlen(a);
        if(l >= 7) printf("%.5lf\n",sum[1000000]);
        else{
            int n = 0;
            for(int i = 0 ; i < l ; i++){
                n = n * 10 + a[i] - '0';
            }
            printf("%.5lf\n",sum[n]);
        }
    }
    return 0;
}

刚刚CSDN炸了 D题
D题理解可能不到位,请指出,但是看代码+注解应该能看懂

发布了72 篇原创文章 · 获赞 4 · 访问量 4058
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览