zoukankan      html  css  js  c++  java
  • Codeforces Round #433

    我会4题,写了两题,还提交错误n次,掉了40rating(哭丧脸),又被学长D飞了。

    学长:我很心疼你的成绩啊;

    我:第四题忘记加特判了。。。

    学长:暴力还能写挂。

    我:。。。。。。

    ———————————————————我是分割线———————————————————

    T1:给定一个n,求一个分数a/b(满足a+b=n)且gcd(a,b)=1,使这个分数<1且最大。。

    我:。。。。

    #include<cstdio>
    #include<cmath>
    using namespace std;
    int gcd(int x,int y){return y==0?x:gcd(y,x%y);}
    int n;
    int main(){
        scanf("%d",&n);
        for(int i=(n-1)/2;i>=1;i--){
            if(gcd(i,n-i)==1){printf("%d %d
    ",i,n-i);break;}
        }
    }

    ———————————————————我是分割线———————————————————

    T2:一共有n个点,其中k个点已经有人居住,求旁边有人居住的空置的点至少有几个,最多有几个。

    我:。。。。。。(如果n==k||k==0输出0 0,否则输出1和j(k*3<=n?j=n-k:j=k*2))

    我:假题。

    #include<cstdio>
    using namespace std;
    long long n,k;
    int main(){
        scanf("%I64d%I64d",&n,&k);
        if(n==k||k==0)puts("0 0");
        else {
            printf("1 ");
            if(k*3<=n)printf("%I64d",k*2);
            else printf("%I64d",n-k);
        }
    }

    ———————————————————我是分割线———————————————————

    T3:有n个航班, 第i个航班原始是从第i秒起飞的。不过由于延误,前k秒不能起飞飞机,要求你让每一个航班在k+1~k+n秒中选一个时间起飞(不能重复),而且每一个航班延误1秒花费的代价为ci,要你求最小的代价。

    我:。。题目正常了。

    感觉尽量让ci越大的航班延误时间越小越好。所以。。大胆猜想!不用证明!

    我们把ci按照时间顺序扔进大根堆里中,然后统计答案就好了。

    然后我想到了,考场上没来得及写啊(抓狂~~~)

    #include<cstdio>
    #include<vector>
    #include<queue>
    using namespace std;
    int g[300005],n,k,c[300005];
    typedef pair<int,int> ii;
    int main(){
        int n,k;
        scanf("%d%d",&n,&k);
        for(int i=0;i<n;i++)scanf("%d",&c[i]);
        priority_queue<ii>pq;k--;
        long long cost=0;
        for(int i=0;i<n||(!pq.empty());i++){
            if(i<n) pq.push(ii(c[i],i));
    
            if(i>k){
                ii re=pq.top();
                pq.pop();
                cost+=1LL*re.first*(i-re.second);
                g[re.second]=i+1;
            }
        }
        printf("%I64d
    ",cost);
        for(int i=0;i<n;i++) printf("%d ",g[i]);
    }

    ———————————————————我是分割线———————————————————

    T4:一共有m张机票,每趟飞机要么从0号点飞向其他点,要么从其他点飞向0号点,给你每趟飞机的到达时间,1-n个城市里刚好有编号为1-n的人,求让这n个人同时在0号城市呆k天且最后回到城市的最小花费是多少。。(时间大小<=1000000)

    我:这题目有点意思。、、、

    过了一会儿。。。

    我:这不就是暴力枚举吗。。。正着枚举一遍时间轴,求1-100000s时n个人到达0号城市的代价,然后反着再枚举一遍时间轴,求n个人回到各自城市的代价。

    然后统计答案就好了,暴力题。(考场上写特判挂了。。。)

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    long long Min(long long a,long long b){return a<b?a:b;}
    struct hh{
        long long d,f,t,c;
    }gg[100001];
    long long n,m,k,cost[100001],sum,qc[1000001],l,qian,ans=999999999999999;
    bool cmp(hh x,hh y){return x.d<y.d;}
    int main()
    {
        scanf("%I64d%I64d%I64d",&n,&m,&k);
        for(int i=1;i<=m;i++) scanf("%I64d%I64d%I64d%I64d",&gg[i].d,&gg[i].f,&gg[i].t,&gg[i].c);
        sort(gg+1,gg+1+m,cmp);
        l=n;qian=1;
        for(long long i=1;i<=1000000;i++)
        {
            while(gg[qian].d==i)
            {
                if(!cost[gg[qian].f]&&gg[qian].f!=0)
                {
                    cost[gg[qian].f]=gg[qian].c;
                    sum+=gg[qian].c;
                    l--;
                }
                else
                {
                    if(cost[gg[qian].f]>gg[qian].c)
                    {
                        sum+=gg[qian].c-cost[gg[qian].f];
                        cost[gg[qian].f]=gg[qian].c;
                    }
                }
                qian++;
            }
            if(!l)
            qc[i]=sum;
            else qc[i]=-1;
        }
        qian=m;l=n;sum=0;
        memset(cost,0,sizeof cost);
        for(long long i=1000000;i>=k+2;i--)
        {
            while(gg[qian].d==i)
            {
                if(!cost[gg[qian].t]&&gg[qian].f==0)
                {
                    cost[gg[qian].t]=gg[qian].c;
                    sum+=gg[qian].c;
                    l--;
                }
                else
                {
                    if(cost[gg[qian].t]>gg[qian].c)
                    {
                        sum+=gg[qian].c-cost[gg[qian].t];
                        cost[gg[qian].t]=gg[qian].c;
                    }
                }
                qian--;
            }
            if(l==0&&qc[i-k-1]!=-1) ans=Min(ans,sum+qc[i-k-1]);
        }
        if(ans!=999999999999999) printf("%I64d",ans);
        else printf("-1");
    }

    ———————————————————我是分割线———————————————————

  • 相关阅读:
    js 格式化时间
    javascript Base64 加密解密方法
    为什么给元素添加了z-index却没有效果
    浮动 与 清除浮动
    Vue 介绍 以及 学习总结(这里不详细展开)
    redux 的基础用法
    c# 几种深拷贝方式的比较
    C#四种深拷贝方法
    Innershar C#中Skip和Take的用法
    DataTable.AcceptChanges方法有何用处
  • 原文地址:https://www.cnblogs.com/ghostfly233/p/7490644.html
Copyright © 2011-2022 走看看