CF3

A

A

直接(Baidu First Search)

#include<bits/stdc++.h>
using namespace std;
namespace red{
#define y1 qwq
#define int long long
#define eps (1e-6)
	inline int read()
	{
		int x=0;char ch,f=1;
		for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
		if(ch=='-') f=0,ch=getchar();
		while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
		return f?x:-x;
	}
	string st,ed;
	struct node
	{
		int x,y,f;
	};
	queue<node> q;
	int dx[]={0,-1,1,0,0,-1,1,1,-1},dy[]={0,0,0,-1,1,-1,1,-1,1};
	string s[]={"Q","U","D","L","R","LU","RD","LD","RU"};
	int g[20][20];
	inline void bfs(int stx,int sty,int edx,int edy)
	{
		stx=8-stx+1,edx=8-edx+1;
		q.push((node){stx,sty,0});
		g[stx][sty]=-1;
		while(!q.empty())
		{
			node now=q.front();
			q.pop();
			int x=now.x,y=now.y;
			if(x==edx&&y==edy)
			{
				cout<<now.f<<endl;
				while(~g[x][y])
				{
					cout<<s[g[x][y]]<<endl;
					int t=g[x][y]&1?g[x][y]+1:g[x][y]-1;
					x+=dx[t],y+=dy[t];
				}
				return;
			}
			for(int k=1;k<=8;++k)
			{
				int tx=x+dx[k],ty=y+dy[k];
				if(tx<1||tx>8||ty<1||ty>8) continue;
				if(g[tx][ty]) continue;
				g[tx][ty]=k;
				q.push((node){tx,ty,now.f+1});
			}
		}
	}
	inline void main()
	{
		cin>>st>>ed;
		bfs(st[1]-'0',st[0]-'a'+1,ed[1]-'0',ed[0]-'a'+1);
	}
}
signed main()
{
	red::main();
	return 0;
}

B

B

我脑残我脑残

把重量为(1)的物品和重量为(2)的物品分类,从小到大排序

然后枚举用几个重量为(1)的物品

#include<bits/stdc++.h>
using namespace std;
namespace red{
#define y1 qwq
#define int long long
#define eps (1e-6)
	inline int read()
	{
		int x=0;char ch,f=1;
		for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
		if(ch=='-') f=0,ch=getchar();
		while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
		return f?x:-x;
	}
	const int N=1e5+10;
	int n,m;
	int ret,numa,numb;
	int st[N],top;
	int tota,totb;
	int sa[N],sb[N];
	struct point
	{
		int val,id;
		inline bool operator < (const point &t) const
		{
			return val>t.val;
		}
	}a[N],b[N];
	inline void main()
	{
		n=read(),m=read();
		for(int x,y,i=1;i<=n;++i)
		{
			x=read(),y=read();
			if(x==1) a[++tota].val=y,a[tota].id=i;
			else b[++totb].val=y,b[totb].id=i;
		}
		sort(a+1,a+tota+1);
		sort(b+1,b+totb+1);
		for(int i=1;i<=tota;++i) sa[i]=sa[i-1]+a[i].val;
		for(int i=1;i<=totb;++i) sb[i]=sb[i-1]+b[i].val;
		for(int i=0;i<=min(m,tota);++i)
		{
			int sumb=min((m-i)>>1,totb);
			if(sa[i]+sb[sumb]>ret)
			{
				ret=sa[i]+sb[sumb];
				numa=i;
				numb=sumb;
			}
		}
		for(int i=1;i<=numa;++i) st[++top]=a[i].id;
		for(int i=1;i<=numb;++i) st[++top]=b[i].id; 
		printf("%lld
",ret);
		sort(st+1,st+top+1);
		for(int i=1;i<=top;++i) printf("%lld
",st[i]);
	}
}
signed main()
{
	red::main();
	return 0;
}
//qnmd

C

C

淦,毒瘤模拟

考虑很多不合法情况:

1.第一个人比第二个人多2个以上

2.第二个人比第一个人多

3.两个人都赢了

4.一个人赢两次(包括有两行或两列,一个人有两个点赢了超过两次但交点超过两个)

5.某个人赢了另一个人还走了下一步

然后其他情况应该比较好判断

#include<bits/stdc++.h>
using namespace std;
namespace red{
#define y1 qwq
#define int long long
#define eps (1e-6)
	inline int read()
	{
		int x=0;char ch,f=1;
		for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
		if(ch=='-') f=0,ch=getchar();
		while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
		return f?x:-x;
	}
	char s[5][5];
	int sum1,sum2;
	bool flag1,flag2;
	int d1[5][5],d2[5][5];
	inline void main()
	{
		for(int i=1;i<=3;++i) scanf("%s",s[i]+1);
		for(int i=1;i<=3;++i)
		{
			for(int j=1;j<=3;++j)
			{
				if(s[i][j]=='X') ++sum1;
				if(s[i][j]=='0') ++sum2;
			}
		}
		if(sum1-sum2>1||sum2>sum1)
		{
			puts("illegal");return;
		}
		for(int i=1;i<=3;++i)
		{
			int sa=0,sb=0;
			for(int j=1;j<=3;++j)
			{
				if(s[i][j]=='X') ++sa;
				if(s[i][j]=='0') ++sb;
			}
			if(flag1&&sa==3){puts("illegal");return;}
			if(flag2&&sb==3){puts("illegal");return;}
			flag1|=(sa==3),flag2|=(sb==3);
			if(sa==3) for(int j=1;j<=3;++j) ++d1[i][j];
			if(sb==3) for(int j=1;j<=3;++j) ++d2[i][j];
		}
		bool q1=0,q2=0;
		for(int i=1;i<=3;++i)
		{
			int sa=0,sb=0;
			for(int j=1;j<=3;++j)
			{
				if(s[j][i]=='X') ++sa;
				if(s[j][i]=='0') ++sb;
			}
			if(q1&&sa==3){puts("illegal");return;}
			if(q2&&sb==3){puts("illegal");return;}
			q1|=(sa==3),q2|=(sb==3);
			if(sa==3) for(int j=1;j<=3;++j) ++d1[j][i];
			if(sb==3) for(int j=1;j<=3;++j) ++d2[j][i];
		}
		flag1|=q1,flag2|=q2;
		int sa=0,sb=0;
		for(int i=1;i<=3;++i)
		{
			if(s[i][i]=='X') ++sa;
			if(s[i][i]=='0') ++sb;
		}
		flag1|=(sa==3),flag2|=(sb==3);
		if(sa==3) for(int i=1;i<=3;++i) ++d1[i][i];
		if(sb==3) for(int i=1;i<=3;++i) ++d2[i][i];
		sa=sb=0;
		for(int i=1;i<=3;++i)
		{
			sa+=(s[i][3-i+1]=='X');
			sb+=(s[i][3-i+1]=='0');
		}
		flag1|=(sa==3),flag2|=(sb==3);
		if(sa==3) for(int i=1;i<=3;++i) ++d1[i][3-i+1];
		if(sb==3) for(int i=1;i<=3;++i) ++d2[i][3-i+1];
		int tot1=0,tot2=0;
		for(int i=1;i<=3;++i)
		{
			for(int j=1;j<=3;++j)
			{
				if(d1[i][j]>1) ++tot1;
				if(d2[i][j]>1) ++tot2;
			}
		}
		if((flag1&&flag2)||(tot1>1)||(tot2>1))
		{
			puts("illegal");return;
		}
		if((flag2&&sum1>sum2)||(flag1&&sum1==sum2))
		{
			puts("illegal");return;
		}
		if(flag1)
		{
			puts("the first player won");
			return;
		}
		if(flag2)
		{
			puts("the second player won");
			return;
		}
		if(sum1+sum2==9)
		{
			puts("draw");
			return;
		}
		if(sum1==sum2)
		{
			puts("first");
			return;
		}
		if(sum1>sum2)
		{
			puts("second");
			return;
		}
	}
}
signed main()
{
	red::main();
	return 0;
}

D

D

先都把括号看作右括号,然后将(a[i]-b[i])扔进堆,然后遇到左括号就 (++sum),否则(--sum)

如果(sum<0),那么从堆顶取一个元素出来代替右括号,(sum+=2)

如果最后(sum!=0)或者某次堆顶没有元素则无解

#include<bits/stdc++.h>
using namespace std;
namespace red{
#define y1 qwq
#define int long long
#define eps (1e-6)
	inline int read()
	{
		int x=0;char ch,f=1;
		for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
		if(ch=='-') f=0,ch=getchar();
		while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
		return f?x:-x;
	}
	const int N=1e5+10;
	struct node
	{
		int val,pos;
		inline bool operator < (const node &t) const
		{
			return val>t.val;
		}
	};
	priority_queue<node> q;
	char s[N];
	int n,m,sum;
	int ret;
	int g[N];
	inline void main()
	{
		scanf("%s",s+1);
		n=strlen(s+1);
		sum=0;
		for(int x,y,i=1;i<=n;++i)
		{
			if(s[i]=='(') ++sum,g[i]=2;
			else --sum,g[i]=3;
			
			if(s[i]=='?')
			{
				x=read(),y=read();
				ret+=y;
				q.push((node){x-y,i});
			}
			
			if(sum<0)
			{
				if(q.empty()) {ret=-1;break;}
				sum+=2;
				node t=q.top();
				q.pop();
				g[t.pos]=2;
				ret+=t.val;
			}
		}
		if(ret==-1||sum)
		{
			puts("-1");
			return;
		}
		printf("%lld
",ret);
		for(int i=1;i<=n;++i)
		{
			putchar(g[i]==2?'(':')');
		}
	}
}
signed main()
{
	red::main();
	return 0;
}
/*
kkk
*/
原文地址:https://www.cnblogs.com/knife-rose/p/12230409.html