CF3
Posted knife-rose
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF3相关的知识,希望对你有一定的参考价值。
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
我脑残我脑残
把重量为(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
淦,毒瘤模拟
考虑很多不合法情况:
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
先都把括号看作右括号,然后将(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
*/
以上是关于CF3的主要内容,如果未能解决你的问题,请参考以下文章
CF3A Shortest path of the king
CF3D Least Cost Bracket Sequence 题解——贪心
cf3D Least Cost Bracket Sequence
CF3D Least Cost Bracket Sequence 贪心