2019-2020 ICPC Northwestern European Regional Programming Contest (NWERC 2019) A,E

E - Expeditious Cubing

题解:
如果有浮点型可能会损失精度,这里说了给出的都是两位小数,所以我们直接把所有小数整体向右移动把他们变成整形,然后推式子的时候先从两个边界推,然后再推一般情况会好写一些。

#include 
//#define int long long
const int N=4e5+7;
using namespace std;
int a[10];
int main()
{
    for(int i=0;i<4;i++){
        int x,y;
        scanf("%d.%d",&x,&y);
        x*=100;
        a[i]=x+y;
    }
    sort(a,a+4);
    int x,y; scanf("%d.%d",&x,&y);
    int k=x*100+y;
    if(k*3>=a[1]+a[2]+a[3]) puts("infinite");
    else if(k*3<a[0]+a[1]+a[2]) puts("impossible");
    else{
        int tmp=k*3-a[1]-a[2];
        printf("%d.",tmp/100);
        tmp=tmp%100;
        if(tmp<10) printf("0%d",tmp);
        else printf("%d",tmp);
        puts("");
    }
}

A - Average Rank

题解:
这道题利用几何意义来进行解决。
平均排名等于w周的排名的和除以w,考虑如果求每个人的排名的和一开始如果每个人的分数都不变,和为n考虑如果某个人分数在第t周从x变到x+1,如何维护这个和,或者说有什么影响一个是分数为x的其他人,他们在这个时刻开始排名+1,每个人排名的和变化(m-t+1)另一个是这个人自己的排名,减少了numx+1其他人没有变化
自己的很好维护,分数为x的那部分打标记维护一下就好了。

#include
using namespace std;
const int N=3e5+7;
int main()
{
    int n,m; cin>>n>>m;
    vector<double> ans(n,m);
    vector<long long>f(m+1,0),g(n,0),point(n,0),num(m+1,0);
    num[0]=n;
    for(int i=1;i<=m;i++){
        int t;
        cin>>t;
        for(int j=1;j<=t;j++){
            int x;
            cin>>x;
            x--;
            ans[x]+=f[point[x]]-g[x];
            f[point[x]]+=(m-i+1);
            num[point[x]]--;
            point[x]++;
            ans[x]-=num[point[x]]*(m-i+1);
            g[x]=f[point[x]];
            num[point[x]]++;
        }
    }
//    cout<<"-----"<
    for(int i=0;i<n;i++) ans[i]+=f[point[i]]-g[i];
    for(int i=0;i<n;i++) printf("%.10lf\n",ans[i]/(1.0*m));
}

你可能感兴趣的:(数学,思维)