比赛6 总结

来源:互联网 发布:手机淘宝怎么搜二手的 编辑:程序博客网 时间:2024/06/05 23:07

  • T1
    • 题面
    • 题意
    • 代码
    • 方法
  • T2
    • 题面
    • 题意
    • 代码
  • T3
    • 题面
    • 题意
    • 超时代码
    • 方法
    • 优先队列
    • 正确代码
  • T4
    • 题面
    • 题意
    • 代码

T1

题面

题意

输入n,输出两和为n的互质数且较小数最大

代码

#include<bits/stdc++.h>using namespace std;int main(){    int n,i;    cin>>n;    for(i=n/2;i>=1;i--)    {        if(__gcd(i,n-i)==1)        {            cout<<i<<" "<<n-i;            return 0;        }    }}

方法

暴力枚举

T2

题面

题意

输入m,k.即m中有k个数为1,其余为0,分别输出最多和最少有多少个0的旁边有1.

代码

#include<bits/stdc++.h>using namespace std;int main(){    int n,k,i;    cin>>n>>k;    if(k==n||k==0)    {        cout<<0<<" "<<0;        return 0;    }    if(k<=n/3)    {        cout<<1<<" "<<k*2;//一个1最多让旁边两个0满足条件        return 0;    }    cout<<1<<" "<<n-k;    return 0;}

T3

题面

题意

有N个航班今天必须离开,其中第i个航班在一天中的第i分钟离开。
由于技术问题,没有航班能够在第一个k分钟内起飞,所以现在必须建立新的起飞时间表。
所有的航班离开时间必须不同,没有航班可以提前起飞。
已知各个航班每延迟一分钟所需成本。请制定新的时间表,输出机场的最低总成本。

超时代码

#include<bits/stdc++.h>#define N 300001#define M 10000000#define ll long longusing namespace std;ll n,t,a,an[N],c[N],xuhao[N],jiage[N];int main(){    ll i,j,ans=0;    cin>>n>>t;    for(i=1;i<=n;i++)    {        cin>>a;        c[i]=a*M+i;    }    sort(c+1,c+n+1);    for(i=1;i<=n;i++)    {        xuhao[i]=c[i]%M;        jiage[i]=c[i]/M;    }    for(i=1;i<=t;i++)    {        an[xuhao[i]]=n+t-i+1;        ans+=jiage[i]*(an[xuhao[i]]-xuhao[i]);    }    for(i=1;i<=n-t;i++)    {           for(j=n;j>t;j--)        {            if(xuhao[j]<=t+i)            {                break;            }        }        an[xuhao[j]]=t+i;        ans+=jiage[j]*(t+i-xuhao[j]);        xuhao[j]=M*2;    }    cout<<ans<<endl;    for(i=1;i<=n;i++)    {        cout<<an[i]<<" ";    }}

方法

优先队列来做
用其他方法必然超时
其中pair<>表示一对数,<>内对一对数定义

优先队列

原理为堆
.push(x)x入队
.pop()去掉队首
.top()表示队首
.empty()判断是否为空,true表示空

正确代码

#include<bits/stdc++.h>#define N 300000#define M 10000000#define ll long longusing namespace std;priority_queue<pair<ll,ll> > A;pair<ll,ll>B;ll t[N+5],q[N+5],n,k;int main(){    ll i;    ll ans=0;    cin>>n>>k;    for(i=1;i<=n;i++)    {        cin>>q[i];    }    for(i=1;i<=n+k;i++)    {        if(i<=n)        {            A.push(pair<ll,ll>(q[i],i));//输入价格和序号        }        if(i>k)        {            B=A.top();            t[B.second]=i;//B.second表示这一对数的第二个            ans+=(i-B.second)*B.first;            A.pop();        }    }    cout<<ans<<endl;    for(i=1;i<=n;i++)    {        cout<<t[i]<<" ";    }}

T4

题面

题意

代码

原创粉丝点击