第一题: tractor

题目描述
  农场上有N(1 <= N <= 50,000)堆草,放在不同的地点上。FJ有一辆拖拉机,也在农场上。拖拉机和草堆都表示为二维平面上的整数坐标,坐标值在1..1000的范围内。拖拉机的初始位置与所有草堆不同。
  FJ开拖拉机时,只能平行于坐标轴(即东、南、西、北四个方向),而且每次开动的一段必须是整数长度。
  例如,他可以向北开2个单位长度,然后向东开3个单位长度。拖拉机不能开到草堆的位置。
  请帮助FJ计算出最少要移动多少个草堆,他才能将拖拉机开回坐标原点。
  拖拉机可以开到1..1000之外的地方去。
输入
  第1行: 3个整数,即N 和拖拉机的初始位置 (x,y)
  第2..1+N行: 每行2个整数,表示一堆草的位置 (x,y)
输出
  第1行: FJ必须移动的最少的草堆的数量
样例输入
  7 6 3
  6 2
  5 2
  4 3
  2 1
  7 3
  5 4
  6 4
样例输出
  1


这道题:可以用BFS,DFS,SPFA,我选择了BFS。但是,我居然把BFS 的模板写错了。于是就死循环 了。就是vis数组的位置,一定要注意。然后剪枝很重要,我基本上能用到最优的剪枝:if (now.w>=ans) continue;

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define maxn 1005
using namespace std;
const int zl[][]={{,,,-},{,-,,}};
int n,xi,yi,ans=;
bool mp[maxn][maxn],vis[maxn][maxn];
struct pp{
int x,y;
int w;
};
pp s;
queue < pp > q;
void bfs(int stx,int sty)
{
s.x=stx;
s.y=sty;
s.w=;
vis[stx][sty]=true;//vis 的位置,bfs 模板....未掌握
q.push(s);
while (!q.empty())
{
pp cur=q.front();
//vis[cur.x][cur.y]=true;//注意在哪里加vis
q.pop();
for (int i=;i<=;i++)
{
int a=cur.x+zl[][i],b=cur.y+zl[][i];
if (vis[a][b]) continue;//否则死循环
pp now;
now.x=a;now.y=b;now.w=cur.w;
if (a<||b<||a>||b>){//到边界随便走
if (cur.w<ans) ans=cur.w;
continue;
}
if (a==&&b==){//到原点
if (mp[a][b]) cur.w++;
if (cur.w<ans) ans=cur.w;
continue;
}
if (mp[a][b]) now.w++;
if (now.w>=ans) continue;//剪枝
vis[a][b]=true; //********
q.push(now);
}
}
}
int main()
{
freopen("tractor.in","r",stdin);
freopen("tractor.out","w",stdout);
cin>>n>>xi>>yi;
for (int i=;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
mp[x][y]=true;
}
bfs(xi,yi);
printf("%d",ans);
return ;
}

第二题:Landscaping

题目描述
  N(1 <= N <= 100)个数排成一行,值分别为A_i,现在希望把每个数对应地改成B_i。(A_i,B_i的值均在0..10之间)。改变的方式有3种:
    (1)把A_i增加到B_i,每增加1,花费$X
    (2)把A_i减少到B_i,每减少1,花费$Y
    (3)把第i个数的值转移到第j个数,每转移1,花费为$Z*|i-j|
  问:最小的花费是多少。
输入
  第1行:4个整数 N, X, Y, Z (0 <= X, Y, Z <= 1000).
  第2..1+N行: 每行2个整数 A_i 和 B_i.
输出
  第1行:1个整数,表示最小的花费。
样例输入
  4 100 200 1
  1 4
  2 3
  3 2
  4 0
样例输出
  210


解:

  考试的时候用的贪心,过了50分剩下的T了,好像大家感到很惊讶。这个贪心,有点神奇。记录最近的方向(即是需要+,还是-)相同和方向相反的点,方向相同的是方便传递。然后转移最近的。最后剩的就是自己+,-了。

  然后这道题是一道DP题。类似于均分纸牌。f[i][j]表示前 i 个数交换 j 个1 的最小花费。

  具体的解释在代码里了。这道DP的思想很重要。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 105
using namespace std;
int n,x,y,z,base=,v;
int cha[maxn],dp[maxn][];
int main()
{
freopen("landscaping.in","r",stdin);
freopen("landscaping.out","w",stdout);
cin>>n>>x>>y>>z;
for (int i=;i<=n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
cha[i]=b-a;//need how much:b-a not a-b
v+=abs(cha[i]);//abs
}
memset(dp,0x3f,sizeof(dp));//赋初值
dp[][base]=;
for (int i=;i<n;i++)
{
for (int j=-v;j<=v;j++)//所有状态
dp[i+][base+j+cha[i+]]=min(dp[i+][base+j+cha[i+]],dp[i][base+j]+z*abs(j));//abs(j)
//前i个人需要j个,所以用i+1给i j个,i+1就需要 j+cha[i+1]个
//从最后一个人考虑,则刚好前n-1 个人需要的j个 与cha[n]抵消,(类似于均分纸牌)
if (cha[i+]>){//自己加
for (int j=v;j>=;j--)
dp[i+][base+j-]=min(dp[i+][base+j-],dp[i+][base+j]+x);
}
else {//自己减
for (int j=-v;j<=-;j++)
dp[i+][base+j+]=min(dp[i+][base+j+],dp[i+][base+j]+y);
}
}
printf("%d",dp[n][base]);
return ;
}

第三题“:equal

【问题描述】
  明明进了中学之后,学到了代数表达式。有一天,他碰到一个很麻烦的选择题。这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的。
  这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。假设你是明明,能完成这个任务吗?
  这个选择题中的每个表达式都满足下面的性质:
    1. 表达式只可能包含一个变量‘a’。
    2. 表达式中出现的数都是正整数,而且都小于10000。
    3. 表达式中可以包括四种运算‘+’(加),‘-’(减),‘*’(乘),‘^’(乘幂),以及小括号‘(’,‘)’。小括号的优先级最高,其次是‘^’,然后是‘*’,最后   是‘+’和‘-’。‘+’和‘-’的优先级是相同的。相同优先级的运算从左到右进行。(注意:运算符‘+’,‘-’,‘*’,‘^’以及小括号‘(’,‘)’都是英文字符)    
    4. 幂指数只可能是1到10之间的正整数(包括1和10)。
    5. 表达式内部,头部或者尾部都可能有一些多余的空格。  
  下面是一些合理的表达式的例子:
    ((a^1) ^ 2)^3,a*a+a-a,((a+a)),9999+(a-a)*a,1 + (a -1)^3,1^10^9……


这道题是noip的某第三道题。由于把多项式展开太复杂,所以我们用类似于多项式计算的方式,把a替代为一个很大的素数,并且计算时mod上一个素数,然后看选项计算的值是否与第一个表达式相同。

表达式的计算,这个模板还需要练。乘方的优先级是最高的需要注意它的判断。乘方用快速幂写。

还有读入:因为要舍去空格,所以建议一个一个的读入。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define maxn 55
#define ll long long
using namespace std;
const ll P[]={,,},Q[]={,,};
int n;
ll ans[];
char s[maxn],symbol[maxn];
ll num[maxn];
int topn,topf;
void read_string()
{
int l=;
char c=getchar();
while (c==' '||c=='\n') c=getchar();
while (c!='\n'&&c!=EOF)
{
if (c!=' ') s[++l]=c;
c=getchar();
}
s[]='(';s[++l]=')';
}
ll ksm(ll a,ll b,ll modd)
{
ll t=,tmp=a;
while (b>)
{
if (b%) t=(tmp*t)%modd;
b=b>>;
tmp=(tmp*tmp)%modd;
}
return t;
}
void pop(ll modd)
{
switch(symbol[topf])
{
case'+':num[topn-]=(num[topn]+num[topn-])%modd;topn--;break;
case'-':num[topn-]=((num[topn-]-num[topn])%modd+modd)%modd;topn--;break;
case'*':num[topn-]=(num[topn-]*num[topn])%modd;topn--;break;
case'^':num[topn-]=ksm(num[topn-],num[topn],modd)%modd;topn--;break;
}
topf--;
}
bool pd(int i)
{
if ((s[i]=='+'||s[i]=='-')&&symbol[topf]!='(') return true;
if (symbol[topf]=='^') return true;//^的优先级最高
if ((s[i]=='*'&&symbol[topf]=='*')) return true;
return false;
}
ll js(int tt)
{
int i=,len=strlen(s);
while (i<len)
{
while (s[i]=='(') {
symbol[++topf]=s[i];
i++;
}
ll x=;
if (s[i]=='a'){
x=Q[tt];i++;
}
else {
while (s[i]>=''&&s[i]<='')
x=x*+s[i++]-'';
}
num[++topn]=x;
do{
if (s[i]==')'){
while (symbol[topf]!='(') pop(P[tt]);
topf--;//删括号 *******
}
else{
while (pd(i)) pop(P[tt]);
symbol[++topf]=s[i];
}
i++;
}while (i<strlen(s)&&s[i-]==')');
}
return num[];
}
int main()
{
freopen("equal.in","r",stdin);
freopen("equal.out","w",stdout);
read_string();//gets 的使用
for (int i=;i<=;i++)
{
memset(symbol,,sizeof(symbol));
memset(num,,sizeof(num));
topn=;topf=;
ans[i]=js(i);
}
cin>>n;
getchar();//getchar
for (int i=;i<=n;i++)
{
memset(s,,sizeof(s));
read_string();
bool b=false;
for (int j=;j<=;j++)
{
memset(symbol,,sizeof(symbol));
memset(num,,sizeof(num));
topn=;topf=;
ll cur=js(j);
if (cur!=ans[j]) {
b=true;
break;
}
}
if (b) continue;
char oo='A'+i-;
printf("%c",oo);
}
return ;
}

【63测试20161111】【BFS】【DP】【字符串】的更多相关文章

  1. 【2019.8.14 慈溪模拟赛 T1】我不是!我没有!别瞎说啊!(notme)(BFS+DP)

    \(IDA^*\) 说实话,这道题我一开始没想出正解,于是写了一个\(IDA^*\)... 但神奇的是,这个\(IDA^*\)居然连字符串长度分别为\(2500,4000\)的数据都跑得飞快,不过数据 ...

  2. ACM/ICPC 之 最短路-Floyd+SPFA(BFS)+DP(ZOJ1232)

    这是一道非常好的题目,融合了很多知识点. ZOJ1232-Adventrue of Super Mario 这一题折磨我挺长时间的,不过最后做出来非常开心啊,哇咔咔咔 题意就不累述了,注释有写,难点在 ...

  3. ZOJ 3596Digit Number(BFS+DP)

    一道比较不错的BFS+DP题目 题意很简单,就是问一个刚好包含m(m<=10)个不同数字的n的最小倍数. 很明显如果直接枚举每一位是什么这样的话显然复杂度是没有上限的,所以需要找到一个状态表示方 ...

  4. 6-3 bash脚本编程之五 字符串测试及for循环

    1. 字符测试 ==:等号两边要有空格,否则会被认为是赋值. !=:  测试是否相等,记住如果不等为真,等为假. -n string: 测试指定字符串是否为空,空位真,不空为假. -s string: ...

  5. 【65测试20161114】【字符串】【DP】

    第一题 复制&粘贴: 文件的内容是一个字符串S,对其进行N次复制&粘贴的操作,第i次操作复制位置Ai和位置Bi之间的所有文字,然后在位置Ci粘贴.这里位置x表示字符串的第x个字符的后面 ...

  6. UVALive 5066 Fire Drill --BFS+DP

    题意:有一个三维的地图,有n个人被困住,现在消防队员只能从1楼的一个入口进入,营救被困者,每一个被困者有一个价值,当消防队员找到一个被困者之后,他可以营救或者见死不救,如果救的话,他必须马上将其背到入 ...

  7. AOJ 0121: Seven Puzzle (BFS DP STL 逆向推理)(转载)

    转载自:  http://m.blog.csdn.net/blog/Enjoying_Science/42008801 题目链接:http://acm.hust.edu.cn/vjudge/probl ...

  8. HDU3247 Resource Archiver(AC自动机+BFS+DP)

    题目,求最短的包含所有n个DNA片段且不包含任何一个病毒片段的序列. 容易用所有DNA片段和病毒片段建一个AC自动机,构造fail时处理一下各个结点后缀是DNA或者病毒的情况,然后dp[S][u]表示 ...

  9. Codeforces 176B (线性DP+字符串)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...

随机推荐

  1. Head中的标签

    Head中的其它一些用法 1.scheme (方案) 说明:scheme can be used when name is used to specify how the value of conte ...

  2. Spine批量导出Command line Export

    1.准备工作及介绍 时间有点紧张,写的不是很详细,请见谅. 当前版本是2.2以上,购买版的.试用版的无法试用Command line Both Spine and the Spine launcher ...

  3. Sql Server2005新特性及性能

    举几个例子来简单说明 这些例子我引用了Northwind库. 1. TOP 表达式 SQL Server 2000的TOP是个固定值,是不是觉得不爽,现在改进了. --前n名的订单declare @n ...

  4. Testng使用方法示例

    TestNG TestNG是一个测试框架,灵感来自JUnit和NUnit.但引入了下面这些新的功能,使它更强大和更容易使用. 注解: 可在任意大的线程池运行您的测试(所有方法在它们自己的线程内,一个线 ...

  5. Android handle 多线程练习

    Android handle <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&quo ...

  6. Cheatsheet: 2015 08.01 ~ 08.31

    Java Beginner's Guide to MVC with Spring Framework Exploring the Spring Web MVC for Web Application ...

  7. Java 中的 static 使用之静态变量

    大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立.然而在某些时候,我们更希望该类所有的对象共享同一个成员.此时就是 static 大显身手的时候了!! Java 中 ...

  8. centos使用yum安装mysql

    参考:http://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/ 1.增加yum数据源 (1.1)从http://dev.mysql.com/dow ...

  9. 《BI那点儿事》数据流转换——数据转换

    数据转换执行类似于T-SQL中的函数CONVERT或CAST的功能.数据转换的编辑界面如图,选择需要转换的列,在DataType下拉列表中选择需要的数据类型.Output Alias栏内设置输出时使用 ...

  10. 《BI那点儿事》数据流转换——逆透视转换

    逆透视转换将来自单个记录中多个列的值扩展为单个列中具有同样值的多个记录,使得非规范的数据集成为较规范的版本.例如,每个客户在列出客户名的数据集中各占一行,在该行的各列中显示购买的产品和数量.逆透视转换 ...