Codeforces Round #657 (Div. 2) A-D

A:枚举哪7个连续字串是abacaba即可,注意一些细节处理

#include 
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
 
char s[110];
char t[10]="abacaba";
char p[110];
int main()
{
	ios::sync_with_stdio(false);
  	cin.tie(0);
  	int T;
  	cin>>T;
  	while(T--)
  	{
  		int n;
  		memset(p,0,sizeof(p));
  		cin>>n>>p;
  		bool z=true;
  		for(int i=0;i+6

B:枚举a,然后b-c最多上下浮动 r-l,所以只需要找到m-n*a的最小绝对值,看b-c是否能凑成即可。

#include 
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt=1;
void init(){cnt=1,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,w;}ee[M*2];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
*/
 
int main()
{
	ios::sync_with_stdio(false);
  	cin.tie(0);
  	int t;
  	cin>>t;
  	while(t--)
  	{
  		ll l,r,m;
  		cin>>l>>r>>m;
  		int a,b,c;
  		for(int i=l;i<=r;i++)
  		{
  			a=i;
  			int tp=a-m%a;
  			b=l,c=l+tp;
  			if(c<=r)
  			{
  				cout<=l)
  			{
  				cout<

C:显然,至多只有一种花买一朵以上。(因为买一朵以上时的收益为b[i],显然直接所有都用收益最高的那一种花即可)

然后枚举哪一种花买一朵以上然后处理下即可。

#include 
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt=1;
void init(){cnt=1,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,w;}ee[M*2];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
*/
struct node{
	int a,b;
	bool operator < (const node & r)const{
		return a>t;
	while(t--)
	{
		int n,m;
		cin>>n>>m;
		for(int i=1;i<=m;i++)cin>>p[i].a>>p[i].b;
		sort(p+1,p+1+m);
		for(int i=1;i<=m;i++)sm[i]=sm[i-1]+p[i].a;
		sm[m+1]=sm[m];
		ll mx=0;
		for(int i=1;i<=m;i++)//m枚举哪一种花买至少一朵
		{
			int pos=lower_bound(p+1,p+1+m,node{p[i].b,0})-p;
			int res=n-(m+1-pos);
			ll tp=0;
			if(p[i].a

D:

显然,客车占用时间段与某一量客车的发车时间重合最优。

枚举起始时间t,然后二分处理即可。

不过我写的比较麻烦。

更简单的做法:把时间%m/2,然后尺取即可。

#include 
using namespace std;
typedef long long ll;
#define pb push_back
const int M = 1e5+7;
struct node{
	int h,m,id;
	bool operator <(const node & r)const{
	//	if(h==r.h)return m>n>>h>>m>>k;
  	for(int i=1;i<=n;i++)cin>>p[i].h>>p[i].m,p[i].id=i;
  	sort(p+1,p+1+n);
  	int mi=n+1,ans=0;//最少需要取消的货车数量 /t最终取值 
  	for(int i=1;i<=n;i++)a[i]=p[i].m;
	int tp,id,nm,l;
	for(int i=1;i<=n;i++)
	{
		tp=p[i].m;
		{
			nm=0;
			tp %= m/2;
			id=upper_bound(a+1,a+1+n,tp-k)-a;
			int r=lower_bound(a+1,a+1+n,tp)-a;
			nm+=max(0,r-id);//(t-k,t)
			if(tpm){
				id=lower_bound(a+1,a+1+n,tp+m/2-m)-a;
				nm+=max(id-1,0);
			}
		}
		//cout<m){
				id=lower_bound(a+1,a+1+n,tp+m/2-m)-a;
				nm+=max(id-1,0);
			}
		}
		if(nmv;
	int t=ans;
	for(int i=1;i<=n;i++)
	{
		int z=a[i],id=p[i].id;
		bool f=false;
		if(zt-k)f=true;
		if(z>t-k+m)f=true;
		if(z>t+m/2-k&&z

 

你可能感兴趣的:(CF)