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......

本次变动:1315-->1320

2020.3.2

posted @ 2020-03-02 11:35  panjx  阅读(245)  评论(0编辑  收藏  举报