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\n",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\n",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");
}

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

posted @ 2017-09-07 16:57  ghostfly233  阅读(1249)  评论(0编辑  收藏  举报