T1

贪心

10 元先找5元

20元 先找10+5,再找3张5

#include<cstdio>

using namespace std;

int m5,m10,m20;

int main()
{
freopen("book.in","r",stdin);
freopen("book.out","w",stdout);
int n;
scanf("%d",&n);
int x;
for(int i=;i<=n;i++)
{
scanf("%d",&x);
if(x==) m5++;
else if(x==)
{
if(!m5) { puts("NO"); return ; }
m5--; m10++;
}
else
{
if(m10 && m5) m10--,m5--;
else if(m5>=) m5-=;
else { puts("NO"); return ; }
}
}
puts("YES"); return ;
}

T2

小c记得的出口位置看做左括号

从右往左扫描 信息

左括号入栈

否则判断当前栈顶 是否能匹配,

匹配则为右括号,不匹配当左括号入栈

栈空则有解,非空则无解

#include<cstdio>
#include<iostream>
#include<algorithm> #define N 1000001 using namespace std; int a[N]; int st[N],top; bool zf[N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int main()
{
freopen("program.in","r",stdin);
freopen("program.out","w",stdout);
int n,m;
read(n);
for(int i=;i<=n;++i) read(a[i]);
read(m);
int x;
for(int i=;i<=m;++i)
{
read(x);
if(a[x]>) a[x]=-a[x];
}
for(int i=n;i;--i)
{
if(a[i]<) st[++top]=a[i],zf[i]=true;
else
{
if(st[top]==-a[i]) top--;
else st[++top]=-a[i],zf[i]=true;
}
}
if(top) { puts("NO"); return ; }
for(int i=;i<=n;i++)
{
if(!zf[i]) printf("+%d ",abs(a[i]));
else printf("-%d ",abs(a[i]));
}
fclose(stdin); fclose(stdout);
return ;
}

不会spj所以不知道对错的代码

对于一个出口,判断前面是否有足够的入口

#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; #define N 1000001 int a[N],b[N];
int tot[N],pre[N]; int outtot[N]; bool out[N],zf[N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int main()
{
freopen("program.in","r",stdin);
freopen("program.out","w",stdout);
int n; read(n);
int x;
for(int i=;i<=n;i++)
{
read(x); a[i]=x;
pre[i]=++tot[x];
}
int m; read(m);
for(int i=;i<=m;++i) read(b[i]);
sort(b+,b+m+);
int t=unique(b+,b+m+)-b-;
for(int i=;i<=t;i++)
{
x=b[i];
outtot[a[x]]++; out[x]=true;
if(pre[x]<outtot[a[x]]*) { puts("NO"); return ; }
}
for(int i=;i<=n;i++)
if(tot[i]&) { puts("NO"); return ; }
for(int i=;i<=n;i++)
{
if(out[i]) printf("-%d ",a[i]);
else if(outtot[a[i]]) printf("+%d ",a[i]),outtot[a[i]]--;
else if(!zf[a[i]]) printf("+%d ",a[i]),zf[a[i]]^=;
else printf("-%d ",a[i]),zf[a[i]]^=;
}
}

T3

把钥匙看做左括号,门看做右括号

模拟括号匹配,任意两点间只有两种状态:匹配,缺右括号

那么问题转化为 从a走到b 能否括号匹配

宽搜+DP

dp[i][j][k]表示 点i到点j 是否有状态k

k=0 表示 i到j的路径上能够括号匹配

k:1——10 表示 点i到j的路径上,栈顶为右括号k

k:11——20 表示点i到j的路径上,栈顶为左括号k,即缺右括号k

每次更新一个ijk,就相当于在ij之间连一条状态为k的边,扔进队列里

从队列里取出 从u到v的状态为w的边

如果w=0,那么 枚举状态k (0,11——20)

if dp[i][u][k]=true  更新 dp[i][v][k]

if dp[v][i][k]=true  更新 dp[u][i][k]

如果w!=0,那么 只能去找右括号

即if dp[v][i][w-10] 更新 dp[u][i][0]

为什么 w=0 是双向更新,w!=0是单项更新?

因为只能是栈中有左括号的情况下,右括号才能入栈

对于每一次询问,判断dp[u][v][0] 即可

#include<cstdio>

using namespace std;

bool dp[][][];

int head,tail;

int q[][];

int main()
{
freopen("maze.in","r",stdin);
freopen("maze.out","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i) dp[i][i][]=true;
int u,v,w;
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
if(!w)
{
dp[u][v][w]=dp[v][u][w]=true;
q[tail][]=u; q[tail][]=v; q[tail++][]=w;
q[tail][]=v; q[tail][]=u; q[tail++][]=w;
}
else if(w<)
{
w=-w;
dp[u][v][w]=dp[v][u][w]=true;
}
else
{
w+=;
dp[u][v][w]=dp[v][u][w]=true;
q[tail][]=u; q[tail][]=v; q[tail++][]=w;
q[tail][]=v; q[tail][]=u; q[tail++][]=w;
}
}
while(head<tail)
{
u=q[head][]; v=q[head][]; w=q[head++][];
if(!w)
{
for(int i=;i<=n;++i)
{
if(dp[i][u][] && !dp[i][v][])
{
dp[i][v][]=true;
q[tail][]=i; q[tail][]=v; q[tail++][]=;
}
if(dp[v][i][] && !dp[u][i][])
{
dp[u][i][]=true;
q[tail][]=u; q[tail][]=i; q[tail++][]=;
}
for(int j=;j<=;++j)
{
if(dp[i][u][j] && !dp[i][v][j])
{
dp[i][v][j]=true;
q[tail][]=i; q[tail][]=v; q[tail++][]=j;
}
}
}
}
else
{
for(int i=;i<=n;++i)
{
if(dp[v][i][w-] && !dp[u][i][])
{
dp[u][i][]=true;
q[tail][]=u; q[tail][]=i; q[tail++][]=;
}
}
}
}
int q;
scanf("%d",&q);
while(q--)
{
scanf("%d%d",&u,&v);
puts(dp[u][v][] ? "YES" : "NO");
}
}

2017 清北济南考前刷题Day 6 morning的更多相关文章

  1. 2017 清北济南考前刷题Day 7 afternoon

    期望得分:100+100+30=230 实际得分:100+100+30=230 1. 三向城 题目描述 三向城是一个巨大的城市,之所以叫这个名字,是因为城市中遍布着数不尽的三岔路口.(来自取名力为0的 ...

  2. 2017 清北济南考前刷题Day 1 afternoon

    期望得分:80+30+70=180 实际得分:10+30+70=110 T1 水题(water) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK出了道水 ...

  3. 2017 清北济南考前刷题Day 3 morning

    实际得分:100+0+0=100 T1 右上角是必败态,然后推下去 发现同行全是必胜态或全是必败态,不同行必胜必败交叉 列同行 所以n,m 只要有一个是偶数,先手必胜 #include<cstd ...

  4. 2017 清北济南考前刷题Day 3 afternoon

    期望得分:100+40+100=240 实际得分:100+40+100=240 将每个联通块的贡献乘起来就是答案 如果一个联通块的边数>点数 ,那么无解 如果边数=点数,那么贡献是 2 如果边数 ...

  5. 2017 清北济南考前刷题Day 4 afternoon

    期望得分:30+50+30=110 实际得分:40+0+0=40 并查集合并再次写炸... 模拟更相减损术的过程 更相减损术,差一定比被减数小,当被减数=减数时,停止 对于同一个减数来说,会被减 第1 ...

  6. 2017 清北济南考前刷题Day 7 morning

    期望得分:100+50+20=170 实际得分:10+50+20=80 1. 纸牌 题目描述 在桌面上放着n张纸牌,每张纸牌有两面,每面都写着一个非负整数.你的邪王真眼可以看到所有牌朝上的一面和朝下的 ...

  7. 2017 清北济南考前刷题Day 6 afternoon

    期望得分:100+100+30=230 实际得分: 正解: 枚举最高的位,这一位m是1但实际用了0 然后剩余的低位肯定是 正数就用1,负数用0 考场思路:数位DP #include<cstdio ...

  8. 2017 清北济南考前刷题Day 5 afternoon

    期望得分:100+100+30=230 实际得分:0+0+0=30 T1 直接模拟 #include<cstdio> #include<iostream> using name ...

  9. 2017 清北济南考前刷题Day 5 morning

    期望得分:100+100+0=200 实际得分: 坐标的每一位不是0就是1,所以答案就是 C(n,k) #include<cstdio> #include<iostream> ...

随机推荐

  1. C#编程概述

    一个简单的c#程序 标识符 标识符是一种字符串,用来命名变量.方法.参数和许多后面将要阐述的其他程序结构. 关键字 所有C#关键字都由小写字母组成,但是.NET类型名使用Pascal大小写约定. Ma ...

  2. caffe with anaconda

    https://blog.csdn.net/u013498583/article/details/74231058 https://www.cnblogs.com/youxin/p/4073703.h ...

  3. YFCC 100M数据集分析笔记

    --从YFCC 100M数据集中筛选出Geo信息位于中国的数据集 1.YFCC 100M简介 YFCC 100M数据库是2014年来基于雅虎Flickr的影像数据库.该库由1亿条产生于2004年至20 ...

  4. week3a:个人博客作业

    1.博客上的问题 阅读下面程序,请回答如下问题: using System; using System.Collections.Generic; using System.Text; namespac ...

  5. 运行时错误 429,ACTIVEX部件不能创建对象的解决方法小结

    错误描述: 发布在IIS上面的网站运行时出现如下错误: Microsoft VBscrīpt 运行时错误 错误 '800a01ad' ActiveX 部件不能创建对象 这个错误是asp组件未注册,而导 ...

  6. WPF自学入门(十二)WPF MVVM模式提取函数

    我们平时在写代码时为了不重复写代码,会进行复制代码或者写通用方法.今天我们就来把上传做的函数提取成为通用的方法调用.把上次写的函数提取为两个主要的文件:ObserableObject和RelayCom ...

  7. Mysql分库分表方案,如何分,怎样分?

    https://www.cnblogs.com/phpper/p/6937896.html 为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这 ...

  8. css中对position的几种定位方式的最佳诠释

    关于元素的position定位的理解,牛客网的hardy给出了一个比较好的理解: 在html中网页可以看成一个立体的空间,一个完整的页面是由很多个页面堆积形成的,如上图所示   CSS中Positio ...

  9. UVAlive3523_Knights of the Round Table

    圆桌骑士.有的骑士之间是相互憎恨的,不能连坐,需要安排奇数个骑士围着桌子坐着,大于3个,求哪些骑士不可能安排到座位. 根据给定的关系,如果两个骑士之间没有憎恨关系,那么连边.最终就是求有多少个点无法位 ...

  10. HDU4726——Kia's Calculation——2013 ACM/ICPC Asia Regional Online —— Warmup2

    题目的意思是给你两个数字(多达10^6位) 做加法,但是有一点,没有进位(进位不算,相当于这一位相加后对10取模) 你可以任意排列两个数字中的每一位,但是不能是0开头. 现在题目要求以这种不进位的算法 ...