codeforces 808

A距离下一个lucky 年 还有多少年   lucky 定义是 数字只有一个位不为0

第一位加上1  然后乘上好几个10就可以

#include <iostream>
#include<string.h>
#include<stdio.h>
using namespace std ;

#define ll __int64

int dig[15];
ll  z[15];
int main()
{
    ll n;
    scanf("%I64d",&n);
    int cnt=0;
    ll a=n;
    z[0]=1;
    for(int i=1;i<=10;i++)
        z[i]=z[i-1]*10;
    while(a)
    {
        dig[cnt++]=a%10;
        a=a/10;
    }
    ll b=(dig[cnt-1]+1)*z[cnt-1];
    printf("%I64d
",b-n);
    return 0;
}
View Code

B 求一下平均

#include <iostream>
#include<string.h>
#include<stdio.h>
using namespace std ;

#define ll __int64
#define MAXN 200100
double z[MAXN];

int main()
{
    int k,n;
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        z[0]=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%lf",&z[i]);
            z[i]=z[i]+z[i-1];
        }
        double ans=0;
        for(int i=k;i<=n;i++)
            ans=ans+z[i]-z[i-k];
        printf("%.7lf
",ans/(n-k+1));
    }
    return 0;
}
View Code

C n个茶杯 m是总共的水 然后n个茶杯的大小每个茶杯里至少有一半的水 然后就是杯子大的水不能比杯子小的水少

1  每个至少有一半

2 从大的杯子到小的杯子加水

#include <iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std ;

#define ll __int64
#define MAXN 200

int w[MAXN];
struct node
{
    int w,ind;
}z[MAXN];
bool cmp(node a,node b)
{
    if(a.w==b.w)
        return a.ind<b.ind;
    return a.w>b.w;
}
int main()
{
    int n,co;
    while(scanf("%d%d",&n,&co)!=EOF)
    {
        memset(w,0,sizeof(w));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&z[i].w);
            z[i].ind=i;
        }
        sort(z+1,z+n+1,cmp);
        for(int i=1;i<=n;i++)
        {
            int ind=z[i].ind;
            w[ind]=(z[i].w+1)/2;
            co=co-w[ind];
        }
        if(co<0)
        {
            printf("-1
");
            continue;
        }
        int j=1;
        while(co>0)
        {
            int ind=z[j].ind;
            int c1=z[j].w-w[ind];
            if(co>c1)
            {
                co=co-c1;
                w[ind]=z[j].w;
            }
            else
            {
                w[ind]=w[ind]+co;
                co=0;
            }
            j++;
        }
        for(int i=1;i<n;i++)
            printf("%d ",w[i]);
        printf("%d
",w[n]);
    }
    return 0;
}
View Code

D 移动一个数字到前面 或者移到后面  位子任意  或者不移动 求  前面的一部分 然后剩下的 他们的和相等


列举每一个数 当作移动的    向前 二分x   sum[x]-w[i]==sum/2  向后二分...   sum[] 是前缀和

nlog(n);    

原文地址:https://www.cnblogs.com/cherryMJY/p/6867176.html