杂题(1)

救生员的小小问题

这里写图片描述

code

//orz 又短又快。。。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef double ldb;
const ldb eps=1e-8;
int n,dx[20],dy[20],tg,tw;
int sx,sy,tx,ty,bg;
ldb ans=1e20,dis=0,lstx,lsty;
int cross(int x1,int y1,int x2,int y2,int x,int y){
    return (x2-x1)*(y-y1)-(y2-y1)*(x-x1);
}
int inline nxt(int x){
    return x==n?1:x+1;
}
int inline lst(int x){
    return x==1?n:x-1;
}
ldb dist(ldb x1,ldb y1,ldb x2,ldb y2){
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
ldb calc(ldb x,ldb y,ldb x1,ldb y1){
    return dist(x,y,x1,y1)*tg+dist(x1,y1,tx,ty)*tw;
}
ldb solve(int x1,int y1,int x2,int y2,int x,int y){
    ldb lx=x1,ly=y1,rx=x2,ry=y2;
    while(fabs(lx-rx)>eps||fabs(ly-ry)>eps){
        ldb x1=(lx+lx+rx)/3.0,y1=(ly+ly+ry)/3.0;
        ldb x2=(lx+rx+rx)/3.0,y2=(ly+ry+ry)/3.0;
        ldb ans1=calc(x,y,x1,y1),ans2=calc(x,y,x2,y2);
        if(ans1>ans2)lx=x1,ly=y1;
        else rx=x2,ry=y2;
    }
    return calc(x,y,lx,ly);
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
        scanf("%d%d",&dx[i],&dy[i]);
    scanf("%d%d%d%d%d%d",&tg,&tw,&sx,&sy,&tx,&ty);
    for(int i=1;i<=n;++i)
        if(cross(dx[i],dy[i],dx[nxt(i)],dy[nxt(i)],sx,sy)==0){bg=i;break;}
    ans=min(ans,solve(dx[bg],dy[bg],dx[nxt(bg)],dy[nxt(bg)],lstx=sx,lsty=sy));
    for(int i=nxt(bg);i!=bg;i=nxt(i)){
        dis+=dist(dx[i],dy[i],lstx,lsty);
        ans=min(ans,solve(dx[i],dy[i],dx[nxt(i)],dy[nxt(i)],lstx=dx[i],lsty=dy[i])+dis*tg);
    }
    dis=0,lstx=sx,lsty=sy;
    for(int i=lst(bg);i!=bg;i=lst(i)){
        dis+=dist(dx[nxt(i)],dy[nxt(i)],lstx,lsty);
        ans=min(ans,solve(dx[nxt(i)],dy[nxt(i)],dx[i],dy[i],lstx=dx[nxt(i)],lsty=dy[nxt(i)])+dis*tg);
    }
    printf("%.6lf",ans);
}

新司机的小小问题


Description

这里写图片描述

#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <deque>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <memory.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
#define ls (oo << 1)
#define rs (oo << 1 | 1)
#define mid ((L + R) / 2)
using namespace std;
typedef long long LL;
#define clr(a, x) memset(a, x, sizeof a)

const int MAXN = 25;
const int MAXM = 7005;

struct Node {
    int t, x, y, p;
    bool operator<(const Node &a) const { return t < a.t; }
};

Node a[MAXN];
int G[MAXN][MAXN];
int idx[MAXM], state[1 << 20], num[MAXM], cnt;
int dp[20][MAXM];
int S[5], vis[5], top;
int n, m, K;
int ans;

void dfs(int cur, int x, int s) {
    if (cur > K)
        return;
    if (x == m) {
        idx[cnt] = s;
        num[cnt] = cur;
        state[s] = cnt++;
        return;
    }
    dfs(cur, x + 1, s << 1);
    dfs(cur + 1, x + 1, s << 1 | 1);
}

void dfs2(int cur, int now, int val, int pos, int s, int x) {
    if (cur == top) {
        if (s == 0)
            ans = max(ans, val);
        for (int i = x; i < m; ++i) {
            int k = state[s | (1 << i)];
            if (now + G[pos][a[i].x] <= a[i].t)
                dp[i][k] = max(dp[i][k], val);
        }
        return;
    }
    for (int i = 0; i < top; ++i)
        if (!vis[i]) {
            vis[i] = 1;
            int v = S[i], nxt = now + G[pos][a[v].y];
            dfs2(cur + 1, nxt, val + max(a[v].p + a[v].t - nxt, 0), a[v].y, s,
                 x);
            vis[i] = 0;
        }
}

void solve() {
    cnt = 0;
    scanf("%d%d%d", &n, &m, &K);
    dfs(0, 0, 0);
    for (int i = 0; i < m; ++i) {
        scanf("%d%d%d%d", &a[i].t, &a[i].x, &a[i].y, &a[i].p);
        a[i].x--;
        a[i].y--;
    }
    sort(a, a + m);
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            scanf("%d", &G[i][j]);
        }
    }
    for (int k = 0; k < n; ++k) { // floyd
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                G[i][j] = min(G[i][j], G[i][k] + G[k][j]);
            }
        }
    }
    clr(dp, -1);
    ans = 0;
    for (int i = 0; i < m; ++i) {
        if (G[0][a[i].x] <= a[i].t)
            dp[i][state[1 << i]] = max(dp[i][state[1 << i]], 0);
        for (int j = 1; j < cnt; ++j)
            if (dp[i][j] != -1) {
                int st = idx[j];
                for (int k = st; ~k; k = k ? (st & (k - 1)) : -1) {
                    top = 0;
                    int tmp = 0;
                    for (int l = 0; l < m; ++l) {
                        if (k & (1 << l))
                            S[top++] = l;
                        else if (st & (1 << l))
                            ++tmp;
                    }
                    if (tmp < K)
                        dfs2(0, a[i].t, dp[i][j], a[i].x, st ^ k, i + 1);
                }
            }
    }
    printf("%d\n", ans);
}

int main() {
    freopen("Taxi.in","r", stdin);
    freopen("Taxi.out","w", stdout);
    solve();
    return 0;
}

龙女仆的小小问题


这里写图片描述

code

//orz root 大佬强无敌
#define _GLIBCXX_IOSTREAM
#include<bits/stdc++.h>

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef double lf;
typedef long double llf;
typedef std::pair<int,int> pii;

#define xx first
#define yy second

template<typename T> inline T max(T a,T b){return a>b?a:b;}
template<typename T> inline T min(T a,T b){return a<b?a:b;}
template<typename T> inline T abs(T a){return a>0?a:-a;}
template<typename T> inline bool repr(T &a,T b){return a<b?a=b,1:0;}
template<typename T> inline bool repl(T &a,T b){return a>b?a=b,1:0;}
template<typename T> inline T gcd(T a,T b){T t;if(a<b){while(a){t=a;a=b%a;b=t;}return b;}else{while(b){t=b;b=a%b;a=t;}return a;}}
template<typename T> inline T sqr(T x){return x*x;}
#define mp(a,b) std::make_pair(a,b)
#define pb push_back
#define I inline
#define mset(a,b) memset(a,b,sizeof(a))
#define mcpy(a,b) memcpy(a,b,sizeof(a))

#define fo0(i,n) for(int i=0,i##end=n;i<i##end;i++)
#define fo1(i,n) for(int i=1,i##end=n;i<=i##end;i++)
#define fo(i,a,b) for(int i=a,i##end=b;i<=i##end;i++)
#define fd0(i,n) for(int i=(n)-1;~i;i--)
#define fd1(i,n) for(int i=n;i;i--)
#define fd(i,a,b) for(int i=a,i##end=b;i>=i##end;i--)
#define foe(i,x)for(__typeof(x.end())i=x.begin();i!=x.end();++i)

struct Cg{I char operator()(){return getchar();}};
struct Cp{I void operator()(char x){putchar(x);}};
#define OP operator
#define RT return *this;
#define RX x=0;char t=P();while((t<'0'||t>'9')&&t!='-')t=P();bool f=0;\
if(t=='-')t=P(),f=1;x=t-'0';for(t=P();t>='0'&&t<='9';t=P())x=x*10+t-'0'
#define RL if(t=='.'){lf u=0.1;for(t=P();t>='0'&&t<='9';t=P(),u*=0.1)x+=u*(t-'0');}if(f)x=-x
#define RU x=0;char t=P();while(t<'0'||t>'9')t=P();x=t-'0';for(t=P();t>='0'&&t<='9';t=P())x=x*10+t-'0'
#define TR *this,x;return x;
I bool IS(char x){return x==10||x==13||x==' ';}template<typename T>struct Fr{T P;I Fr&OP,(int &x)
{RX;if(f)x=-x;RT}I OP int(){int x;TR}I Fr&OP,(ll &x){RX;if(f)x=-x;RT}I OP ll(){ll x;TR}I Fr&OP,(char &x)
{for(x=P();IS(x);x=P());RT}I OP char(){char x;TR}I Fr&OP,(char *x){char t=P();for(;IS(t);t=P());if(~t){
for(;!IS(t)&&~t;t=P())*x++=t;}*x++=0;RT}I Fr&OP,(lf &x){RX;RL;RT}I OP lf(){lf x;TR}I Fr&OP,(llf &x){RX;RL;RT}I OP llf(){llf x;TR}
I Fr&OP,(uint &x){RU;RT}I OP uint(){uint x;TR}I Fr&OP,(ull &x){RU;RT}I OP ull(){ull x;TR}};Fr<Cg>in;
#define WI(S) if(x){if(x<0)P('-'),x=-x;char s[S],c=0;while(x)s[c++]=x%10+'0',x/=10;while(c--)P(s[c]);}else P('0')
#define WL if(y){lf t=0.5;for(int i=y;i--;)t*=0.1;if(x>=0)x+=t;else x-=t,P('-');*this,(ll)(abs(x));P('.');if(x<0)x=-x;\
while(y--){x*=10;x-=floor(x*0.1)*10;P(((int)x)%10+'0');}}else if(x>=0)*this,(ll)(x+0.5);else *this,(ll)(x-0.5);
#define WU(S) if(x){char s[S],c=0;while(x)s[c++]=x%10+'0',x/=10;while(c--)P(s[c]);}else P('0')
template<typename T>struct Fw{T P;I Fw&OP,(int x){WI(10);RT}I Fw&OP()(int x){WI(10);RT}I Fw&OP,(uint x){WU(10);RT}
I Fw&OP()(uint x){WU(10);RT}I Fw&OP,(ll x){WI(19);RT}I Fw&OP()(ll x){WI(19);RT}I Fw&OP,(ull x){WU(20);RT}
I Fw&OP()(ull x){WU(20);RT}I Fw&OP,(char x){P(x);RT}I Fw&OP()(char x){P(x);RT}I Fw&OP,(const char *x){while(*x)P(*x++);RT}
I Fw&OP()(const char *x){while(*x)P(*x++);RT}I Fw&OP()(lf x,int y){WL;RT}I Fw&OP()(llf x,int y){WL;RT}};Fw<Cp>out;

const int N=205,M=400000,Nf=255;

struct edge
{
    int to,w,ne,v;
}e[M*2+2];

int p[N+1],em=2,q[N<<1],qe,fa[N+1],dis[N+1];
bool vis[N+1];

inline void add(int a,int b,int w,int v)
{
    e[em].to=b,e[em].w=w,e[em].v=v,e[em].ne=p[a],p[a]=em++;
    e[em].to=a,e[em].w=0,e[em].v=-v,e[em].ne=p[b],p[b]=em++;
}

inline int wxhcoder(int s,int t,int &cost)
{
    cost=0;
    int flow=0;
    while(1)
    {
        memset(dis,0x3f,sizeof(dis));
        memset(fa,0x3f,sizeof(fa));
        dis[s]=0; 
        vis[s]=1;
        q[0]=s,qe=1;
        for(int i=0;i^qe;i++)
        {
            int k=q[i&Nf];
            for(int j=p[k];j;j=e[j].ne)
                if(e[j].w&&dis[e[j].to]>dis[k]+e[j].v)
                {
                    dis[e[j].to]=dis[k]+e[j].v;
                    fa[e[j].to]=j^1;
                    if(!vis[e[j].to])q[(qe++)&Nf]=e[j].to,vis[e[j].to]=1;
                }
            vis[k]=0;
        }
        if(fa[t]==0x3f3f3f3f)break;
        int rfl=0x7fffffff;
        for(int i=t;i!=s;i=e[fa[i]].to)
            repl(rfl,e[fa[i]^1].w);
        cost+=dis[t]*rfl;
        flow+=rfl;
        for(int i=t;i!=s;i=e[fa[i]].to)
            e[fa[i]].w+=rfl,e[fa[i]^1].w-=rfl;
    }
    return flow;
}

int n,m,a[100],b[100],g[100];
int main()
{
    in,n,m;
    fo0(i,n)in,a[i];
    fo0(i,n)in,b[i];
    int S=n*2,T=n*2+1;
    fo0(i,n)add(S,i,1,0);
    fo0(i,n)add(i+n,T,1,0);
    fo0(i,n)
    {
        mset(g,0xff);
        for(int x=a[i],j=0;!~g[x];x=(ll)x*m%n,j++)
            g[x]=j;
        fo(j,i+1,n-1)if(~g[a[j]])add(i,j+n,1,g[a[j]]*(a[j]+1));
    }
    fo0(i,n)add(S,i+n,1,b[i]);
    int cost,flow=wxhcoder(S,T,cost);
    out,cost,'\n';
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值