2018.10.02 练习赛

[T1 蒜头君当大厨]

题解:

显然差分约束,怕你看不出样例还疯狂暗示你= =

\(code\):

#include<stdio.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<ctype.h>
#define ll long long
using namespace std;

char buf[1<<20],*p1,*p2;
inline char gc()
{
//  return getchar();
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin))==p1?0:*p1++;
}

template<typename T>
inline void read(T &x)
{
    char tt;
    bool flag=0;
    while(!isdigit(tt=gc())&&tt!='-');
    tt=='-'?(flag=1,x=0):(x=tt-'0');
    while(isdigit(tt=gc())) x=x*10+tt-'0';
    if(flag) x=-x;
}

struct node{
    ll x,len;
    inline node(ll a=0,ll b=0)
    {
        x=a;
        len=b;
    }
    inline bool operator<(node a)const
    {
        return len<a.len;
    }
};

queue<ll>q;
vector<node>G[20005];
ll n,m,dis[20005],tot[20005];
bool book[20005];

int spfa(int s) {
    for(int i=1; i<=n; i++) dis[i]=-1,book[i]=false;
    dis[s]=0,q.push(s),book[s]=true,tot[s]++;
    while (!q.empty()) {
        ll x=q.front();
        q.pop(),book[x]=false;
        if(tot[x]==n+1) return -1;
        for (int i=G[x].size()-1; i>=0; i--) {
            ll p=G[x][i].x;
            ll len=G[x][i].len;
            if(dis[p]>=dis[x]+len) continue;
            dis[p]=dis[x]+len;
            if(book[p]) continue;
            q.push(p),book[p]=true,tot[p]++;
        }
    }
    return 1;
}

int main()
{
    read(n),read(m);
    for(ll i=1;i<=n;i++)
    G[0].push_back(node(i,0));
    for(int i=1;i<=m;i++)
    {
        ll op,x,y,z;
        read(op);
        if(op<=2) read(x),read(y),read(z);
        if(op>=3) read(x),read(z);
        if(op==1) G[x].push_back(node(y,z));
        if(op==2) G[y].push_back(node(x,z));
        if(op==3) G[0].push_back(node(x,z));
        if(op==4) G[x].push_back(node(0,-z));
    }
    ll ans=0;
    if(spfa(0)==-1) puts("I can't"),exit(0);
    for(int i=1;i<=n;i++)
    ans=max(ans,dis[i]);
    printf("%lld",ans);
}

[T2 上课]

题解:

贪心预处理出\(g[i]\),表示能力为\(i\)时最早的时刻为多少,然后就类似背包一样的\(DP\)

\(code:\)

#include<stdio.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<ctype.h>
#define ll long long
#define inf 1e9+9
using namespace std;

char buf[1<<20],*p1,*p2;
inline char gc()
{
//  return getchar();
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin))==p1?0:*p1++;
}

template<typename T>
inline void read(T &x)
{
    char tt;
    bool flag=0;
    while(!isdigit(tt=gc())&&tt!='-');
    tt=='-'?(flag=1,x=0):(x=tt-'0');
    while(isdigit(tt=gc())) x=x*10+tt-'0';
    if(flag) x=-x;
}

struct node{
    int t,len,x;
    inline node(int a=0,int b=0,int c=0)
    {
        t=a;
        len=b;
        x=c;
    }
    inline bool operator<(node a) const
    {
        return t<a.t;
    }
}a[1005];

int t,m,n;
int f[1005],g[105];
int main()
{
    read(t),read(m),read(n);
    for(int i=1;i<=m+1;i++) f[i]=-inf;
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        read(x),read(y),read(z);
        a[i]=node(x,y,z);
    }

    a[0].x=1,a[0].len=0,a[0].t=1,a[m+1].t=t+1;
    sort(a+1,a+1+m);

    for(int i=0;i<=100;i++) g[i]=inf;
    for(int i=1;i<=n;i++)
    {
        int x,y;
        read(x),read(y);
        g[y]=min(g[y],x);
    }

    for(int i=1;i<=100;i++) g[i]=min(g[i],g[i-1]);

    for(int i=1;i<=m+1;i++)
    for(int j=0;j<i;j++)
    f[i]=max(f[i],f[j]+(a[i].t-(a[j].t+a[j].len))/g[a[j].x]);

    printf("%d",f[m+1]);
}

[T3 营救]

题解:

说实话思路很简单,但是但代码实现能力对我来说是硬伤啊\(......\)正解\(BFS+\)三进制状压\(DP\),略恶心

\(code:\)

#include<stdio.h>
#include<iostream>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<queue>
#define ll long long
#define inf 1e9+9
using namespace std;

struct point{
    int x,y;
    inline point(int a=0,int b=0)
    {
        x=a;
        y=b;
    }
}start,end_;

struct node{
    int x,y,s;
    inline node(int a=0,int b=0,int c=0)
    {
        x=a;
        y=b;
        s=c;
    }
    inline node(point a,int b=0)
    {
        x=a.x;
        y=a.y;
        s=b;
    }
};

int n,m,k,ans=inf,tot;
int val[11];
char a[11][11],ss[11];
int f[200005][11][11];
int s[20];
queue<node>q;
int quanji;
int calspd(int num)
{
    int len=0,sum=k;
    memset(s,0,sizeof(s));
    while(num)
    {
        s[++len]=num%3;
        num/=3;
    }
    for(int i=1;i<=tot;i++)
    sum+=(s[i]==1)?val[i]:0;
    return sum<1?1:sum;
}

int merge(int num,int x,int y)
{
    int len=0,sum=0;
    memset(s,0,sizeof(s));
    while(num)
    {
        s[++len]=num%3;
        num/=3;
    }
    int flag=0;
    for(int i=1;i<=tot;i++)
    if(ss[i]==a[x][y]) flag=i;
    if(s[flag]) return 0;
    s[flag]=1;
    for(int i=tot;i>=1;i--)
    sum=sum*3+s[i];
    return sum;
}

int drop1(int num)//放下减速的
{
    int len=0,sum=0;
    memset(s,0,sizeof(s));
    while(num)
    {
        s[++len]=num%3;
        num/=3;
    }
    for(int i=1;i<=tot;i++)
    if(s[i]==1&&val[i]>0) s[i]=2;
    for(int i=tot;i>=1;i--)
    sum=sum*3+s[i];
    return sum;
}

int drop2(int num)//全放下
{
    int len=0,sum=0;
    memset(s,0,sizeof(s));
    while(num)
    {
        s[++len]=num%3;
        num/=3;
    }
    for(int i=1;i<=tot;i++)
    if(s[i]) s[i]=2;
    for(int i=tot;i>=1;i--)
    sum=sum*3+s[i];
    return sum;
}

int main()
{
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    {
        char tt;
        scanf("\n%c",&tt);
        if(tt=='s') start=point(i,j);
        if(tt=='#') a[i][j]='#';
        if(tt=='t') end_=point(i,j);
        if(tt>='A'&&tt<='Z') a[i][j]=tt,tot++;
    }
    quanji=pow(3,tot)-1;
    for(int i=1;i<=tot;i++)
    {
        char tt;
        int x;
        scanf("\n%c%d",&tt,&x);
        ss[i]=tt;
        val[tt-'A'+1]=x;
    }
//  printf("%d %d %d",drop1(3),drop2(3),merge(3,3,3));

    for(int i=0;i<=quanji;i++)
    for(int j=1;j<=10;j++)
    for(int z=1;z<=10;z++)
    f[i][j][z]=inf;
    f[0][start.x][start.y]=0;

    q.push(node(start,0));
    while(!q.empty())
    {
        int tx=q.front().x,ty=q.front().y,ts=q.front().s;
        q.pop();
        int spd=calspd(ts);
        if(tx+1<=n&&a[tx+1][ty]!='#'&&f[ts][tx+1][ty]>f[ts][tx][ty]+spd)//下
        {
            f[ts][tx+1][ty]=f[ts][tx][ty]+spd;
            q.push(node(tx+1,ty,ts));
        }
        if(ty+1<=m&&a[tx][ty+1]!='#'&&f[ts][tx][ty+1]>f[ts][tx][ty]+spd)//右
        {
            f[ts][tx][ty+1]=f[ts][tx][ty]+spd;
            q.push(node(tx,ty+1,ts));
        }
        if(tx-1>0&&a[tx-1][ty]!='#'&&f[ts][tx-1][ty]>f[ts][tx][ty]+spd)//上
        {
            f[ts][tx-1][ty]=f[ts][tx][ty]+spd;
            q.push(node(tx-1,ty,ts));
        }
        if(ty-1>0&&a[tx][ty-1]!='#'&&f[ts][tx][ty-1]>f[ts][tx][ty]+spd)//左
        {
            f[ts][tx][ty-1]=f[ts][tx][ty]+spd;
            q.push(node(tx,ty-1,ts));
        }
        if(a[tx][ty]>='A'&&a[tx][ty]<='Z')//合并
        {
            int newset=merge(ts,tx,ty);
            if(!newset||f[newset][tx][ty]<=f[ts][tx][ty]) continue;
            f[newset][tx][ty]=f[ts][tx][ty];
            q.push(node(tx,ty,newset));
        }
        if(tx==end_.x&&ty==end_.y)//放下
        {
            int new1=drop1(ts),new2=drop2(ts);
            if(f[new1][tx][ty]>f[ts][tx][ty])
            {
                f[new1][tx][ty]=f[ts][tx][ty];
                q.push(node(tx,ty,new1));
            }

            if(f[new2][tx][ty]>f[ts][tx][ty])
            {
                f[new2][tx][ty]=f[ts][tx][ty];
                q.push(node(tx,ty,new2));
            }
        }
    }
    printf("%d",f[quanji][end_.x][end_.y]);
}

原文地址:https://www.cnblogs.com/KatouKatou/p/9738736.html

时间: 2024-10-01 00:05:39

2018.10.02 练习赛的相关文章

2018.10.15 练习赛 搜索专练

T1 乘积分解 题解: 预处理出\(n\)的约数,用\(F[i][j]\)记录从排序后的第i个因数出发,连续\(j\)个因数的乘积. 要求\(fFi][j]<=n\),且\(j<=k\) \(code\): #include<cstdio> #include<algorithm> #include<iostream> #include<ctype.h> #include<ctime> #define ll long long usin

2018.10.18 练习赛 数学专练

T1 打气球 题解: 期望递推,不关心具体位置,所以\(F[i][j]\)表示还有\(i\),\(j\)行,列未完; \(code\): #include<cstdio> #include<algorithm> #include<ctype.h> #include<vector> #include<queue> #include<cstring> #define lowbit(x) (x&-x) #define ll long

每日一句2018.10.02

Practice, under pressure, with focus, and with that glorious end goal in sight, makes perfect. 在压力下练习,专注,眼中只有美好的最终目标,才能造就完美. 原文地址:https://www.cnblogs.com/565261641-fzh/p/9736835.html

2018.10.02 LeetCode 刷题日记 第17题

手机小键盘 2-9 数字键上有分别对应的字母,输入一串数字,如234,则 2-abc,3-def,4-ghi,按顺序每个数字选择一个字母,输出全部的字母组合 从第一个数的第一个字母开始,向下找数,每种情况结束后进行回溯 读入 23 2- abc 选a 读3 - def 选d .选 e .选f 此时再进行回溯方法,索引已经超过范围,第一次结束 2中选b  依次进行回溯 回溯方法总结: 确定函数结束条件 依次往下找,知道触碰结束,回到上层,重新开始 代码如下: class Solution { pu

最新最准确各大搜索引擎蜘蛛名称2014-4-15 10:02:52

最新最准确各大搜索引擎蜘蛛名称2014-4-15 10:02:52 1.百度蜘蛛:Baiduspider网上的资料百度蜘蛛名称有BaiduSpider.baiduspider等,都洗洗睡吧,那是旧黄历了.百度蜘蛛最新名称为Baiduspider.日志中还发现了Baiduspider-image这个百度旗下蜘蛛,查了下资料(其实直接看名字就可以了……),是抓取图片的蜘蛛.常见百度旗下同类型蜘蛛还有下面这些:Baiduspider-mobile(抓取wap).Baiduspider-image(抓取

静态类2014年6月9日10:02:28

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace 静态类密闭类 7 { 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 //A a = new A();//错误,静态类不能new 13 14 //Math m = new Math();//错误,静态类不能

提供全面石油天然气建筑风电场建筑ACS CONNECT Edition 10.02

Bentley是全球领导者,致力于为建筑师,工程师,建设者和业主运营商提供全面的架构和工程软件解决方案,以支持基础设施建设.宾利成立于1984年,在45个国家拥有近3,000名同事,年收入5亿美元,自2001年以来,已经投资超过10亿美元用于研究,开发和收购Bentley系统公司已发布SACS CONNECT Edition 10.02.00.01,是用于分析和设计新的和现有的固定式近海石油和天然气建筑和风电场建筑分析设计软件. Avenza Geographic Imager for Adob

phpStudy + JspStudy 2014.10.02 下载

phpStudy + JspStudy 2014.10.02 下载 目标:让天下没有难配的php环境. phpStudy Linux版&Win版同步上线 支持Apache/Nginx/Tengine/Lighttpd/IIS7/8/6 『软件简介』该程序包集成最新的Apache+Nginx+LightTPD+PHP+MySQL+phpMyAdmin+Zend Optimizer+Zend Loader,一次性安装,无须配置即可使用,是非常方便.好用的PHP调试环境.该程序绿色小巧简易迷你仅有32

2018/10/10 awk 分析 nginx 日志

废话不多说,简单了解一下 awk - 强大的文本分析工具,也就是分析日志 最常用的就是分析日志了吧,做统计什么,这里也拿 nginx 日志来做分析 1:统计出现次数 - 比如状态码出现次数 - 先直接上命令 awk '{print $9}' access_log | sort | uniq -c | sort -rn - 可能会有一些疑惑,这个$9 是什么? - 我们拿出一条日志来看一下先 123.124.16.83 - - [10/Oct/2018:10:24:56 +0800] "GET /