Codeforces Round #625 (Div. 2)
A题
Codefores链接
题意:
给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题
Codefores链接
题意:
给你一个数列a,按从左到右的顺序选择序列中的一些数,第一个数随便选,但后面的数必须满足:令这一个数位置为i,下一个选的数的位置为j,则要满足:
\(i<j\) 且 \(j-i=a[j]-a[i]\)
求选出来这些数最大之和。
题解####
纯为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......