Codeforces Round 542 (Div. 2)

传送门

前三题太简单不写

D.Toy Train (贪心)

题意

有n个车站,按照环前进,有m条要求从x送到y,每次从x最多能拿一个糖,输出在第i个车站出发最少需要多少时间完成所有要求 (注意车的容量无穷)

思路

所以我们直接枚举每个点就行了啊。。。找到一个花费最多的点 把他送完答案就出来了 当然在送他的时候顺便把其它的都送了所以贪心的策略就是最后送少的。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int maxn=5e4+50;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
ll num[maxn],len[maxn];
int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    ll n,m;
    cin>>n>>m;
    fill(len,len+maxn,inf);
    while(m--){
        ll a,b;
        cin>>a>>b;
        num[a]++;
        if(a<b)len[a]=min(len[a],b-a);
        else len[a]=min(len[a],n-a+b);
    }
    for(int i=1;i<=n;i++){
        if(num[i]==0)len[i]=0;
    }
    for(int i=1;i<=n;i++){
        ll ans=0;
        for(int j=1;j<=n;j++){
            ll dis=(j>=i)?j-i:n-i+j;
            dis+=(num[j]-1ll)*n+len[j];
            ans=max(ans,dis);
        }
        cout<<ans<<" ";
    }
    return 0;
}

E.Wrong Answer

题意

构造题,这里有一段代码:它只会记录和为非负数的一段数乘以其区间长度的最大值,但我们现在要求的是sum{ai}*(r-l+1),l<=i<=r,很明显这段代码是有错误的。

然后会输入一个k,你构造一组数据,使得正解和这段代码给出的答案相差k。最后输出你给出的数据。

思路

假设前面1998个a[i]的值为0,倒二的值为-p,最后一个的值为d+p;然后正解的答案是2000*d
题目的答案的d+p 相差为2000d-(d+p)=K;
1999d=k+p;
d=(k+p)/1999
令d=1999-k%19;

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+50;

int main()
{
    int k;
    cin>>k;
    int p=1999-k%1999;;
    cout<<2000<<endl;
    for(int i=1;i<=1998;i++)cout<<0<<" ";
    cout<<-p<<" "<<((k+p)/1999+p)<<endl;
    return 0;
}

posted @ 2019-02-25 23:20  luowentao  阅读(178)  评论(0编辑  收藏  举报