CSP2022-12

闲时记录 / 2023-05-03 / 原文

第一题(太水了)

#include <cmath>
#include <iostream>
#include <iomanip>
using namespace std;

const int N = 1e6+10 ; 
int n; 
double lixi, w, sum = 0;

int main(){
    
    cin>> n>> lixi ; 
    
    for(int i=0; i<=n; i++)
    {
        cin>>w ;
        sum += w / pow((1.0+lixi),i);
    }
    
    cout<<fixed<<setprecision(3)<<sum ;
    return 0 ; 
}

第二题

稍微复杂一点,花了将近一个小时的时间,主要是第二行的最晚时间不好算,好在也ac了

#include <cmath>
#include <iostream>
#include <iomanip>
using namespace std;

const int N = 1e6+10 ; 
int q[N] , yilai[N]; 
int ear[N],last[N]; 
int n, m ; // n天 m科
bool flag = true ; // 标记是否可以输出第二行

int main(){
    
    cin>> n>> m; 
    
    for(int i=1; i<=m; i++)     scanf("%d", &yilai[i]) ;
    
    for(int i=1; i<=m; i++)     scanf("%d", &q[i]) ; //当前所需天数
    
    for(int i=1; i<=m; i++)
    {
        if(yilai[i] == 0) ear[i] = 1 ; 
        else    ear[i] = q[yilai[i]] + ear[yilai[i]] ;
        cout<<ear[i]<<' ';  // 最早开始时间
        if(ear[i]+q[i] > n+1) flag = false ; // 做不完
    }
    
    cout<<endl;
    
    if(flag)    // 倒着算
    {
        for(int i=m; i>=1; i--)
        {
            bool zhaodao = false ; 
            int minl = N;
            for(int j=1; j<=m ;j++) //寻找依赖关系 i=2
            {
                if(yilai[j] == i)   //yilai[5] = 2
                {
                    zhaodao = true ; 
                    minl = min(last[j], minl) ; // 3同时被4 6 依赖,选最早开始的
                }
            }
            if(!zhaodao) //没找到,说明是叶子节点
            {
                last[i] = n+1-q[i] ;
            }
            else
            {
                last[i] = minl - q[i] ; 
            }
            
        }
        
        for(int i=1; i<=m; i++) cout<<last[i]<<' ' ; 
    }
    
    return 0 ; 
}