Codeforces Round #625 (Div. 2)

A题

题意:

给AB两个01序列,长度为n,表示n个项目。0表示不会,1表示会;对于每个位置,都分数≥1。
现在你要分配分数(分数自己定),使得A会的项目的分数之和>B会的项目分数之和,求A会的项目中分数最高的那个最小是多少。
如果怎么分配都无法完成,输出-1。

题解

很明显,在AB都会的情况下,不论定什么分数都无所谓,那肯定定最小的1.
如果B会A不会
那把ans0加一(因为要最高的最小,姑且设B会A不会的都为1分
如果A会B不会
那把ans1加一
ans0/ans1+1就ok了(平均)
因为是大于,所以还需要向上取整(口胡)

code:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
using namespace std;
int n,a[10005],b[10005],ans1,ans0,ans;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++)
    {
        cin>>b[i];
    }
    for(int i=1;i<=n;i++)
    {
        if(a[i]==1&&b[i]==0)
        ans1++;
        else if(a[i]==0&&b[i]==1)
        ans0++;
    }
    if(ans1==0)
    {
        cout<<-1;
    }
    else
    {
        cout<<ans0/ans1+1; 
    }
    return 0;
}

B题

题意:

给你一个数列a,按从左到右的顺序选择序列中的一些数,第一个数随便选,但后面的数必须满足:令这一个数位置为i,下一个选的数的位置为j,则要满足:
\(i<j\)\(j-i=a[j]-a[i]\)
求选出来这些数最大之和。

题解

这题其实原来是不会的......多亏syk大佬出手教授解题思路,得以AC此题。所以接下来纯为pjx的自己口胡:
\(f[i]\)为在前i个元素中选出来的数最大值和
则答案便为\(f[n]\)(都知道)
那么我们先预处理出一个数组,\(temp[i]=a[i]-i\),表示上一个选的数的位置
还要再设一个数组\(last[i]\),每次表示更新\(temp[i]\)但又概率\(temp\)会为负数,所以\(last[temp[i]+大数]\)
所以\(f[i]=last[temp[i]+2e+15]+b[i]\)
\(ans\)每个\(f[i]\)取个最大值
END

code:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
using namespace std;
const int big=200010;
int be[big],n;
int f[big],last[big<<2],ans,temp[big];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>be[i];
        temp[i]=be[i]-i;
    }
    for(int i=1;i<=n;i++)
    {
        f[i]=f[last[temp[i]+big+big]]+be[i];
        if(f[i]>f[last[temp[i]+big+big]])
        last[temp[i]+big+big]=i;
        ans=max(f[i],ans);
    }
    cout<<ans;
    return 0;
}

总结

这次一如既往地滚粗了,AC两题,中间细节方面WA了好几次,最后700多分,就rank2900多...... TQT
不过因为我太菜了(就1300rat),竟然还+5rat......

本次变动:1315-->1320

2020.3.2

猜你喜欢

转载自www.cnblogs.com/pjxpjx/p/12393014.html