内网OJ题解

OJ1001A+B Problem:

  a+b。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,b;
    cin>>a>>b;
    cout<<a+b<<endl;
    return 0;
}

my code

OJ1004讲笑话

  用sum[i]记录前缀和为i的位置数量。

  ans=sum[0]+Σsum[i]*(sum[i]-1)/2。

#include<cstdio>
#include<iostream>
using namespace std;
int n,sum[2000015];
int main(){
    scanf("%d",&n);int cur=n;
    for (int x,i=1;i<=n;++i){
        scanf("%d",&x);
        ++sum[cur+=x];
    }
    int res=sum[n];
    for (int i=0;i<=2000000;++i) res=(res+1ll*sum[i]*(sum[i]-1)/2)%999999;
    cout<<res<<endl;
    return 0;
}

my code

OJ1006海岛之桥

  最小生成树。

var
  ans,i,j,n:longint;
  dis:array[1..100,1..100]of longint;
  bo:array[1..100]of boolean;
procedure mst;
var
  min,mini:longint;
  lowest:array[1..100]of longint;
begin
  for i:=2 to n do
    lowest[i]:=maxlongint;
  lowest[1]:=0;
  while true do
  begin
    min:=maxlongint;
    for i:=1 to n do
    begin
      if (bo[i]) and (lowest[i]<min) then
      begin
        min:=lowest[i];
        mini:=i;
      end;
    end;
    if min=maxlongint then
      break;
    bo[mini]:=false;
    ans:=ans+min;
    for i:=1 to n do
      if (bo[i]) and (dis[mini,i]<lowest[i]) then
        lowest[i]:=dis[mini,i];
  end;
end;

begin
  readln(n);
  for i:=1 to n-1 do
    for j:=i+1 to n do
    begin
      read(dis[i,j]);
      dis[j,i]:=dis[i,j];
    end;
  fillchar(bo,sizeof(bo),true);
  mst;
  writeln(ans);
end.

my code

OJ1007[jsoi2008]星球大战

  离线处理,利用并查集求连通块数,将删点变为加点。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1000010;
int n,m,k,res,tot,v[maxn],in[maxn],fa[maxn],ans[maxn],now[maxn],pre[maxn],son[maxn],des[maxn];
void Connect(int a,int b){
    pre[++tot]=now[a];
    now[a]=tot;
    son[tot]=b;
}
void Init(){
    scanf("%d%d",&n,&m);
    for (int x,y,i=1;i<=m;++i){
        scanf("%d%d",&x,&y);
        Connect(x,y),Connect(y,x);
    }
    scanf("%d",&k);
    for (int i=1;i<=k;++i){
        scanf("%d",&des[i]);
        v[des[i]]=1;
    }
}
int Get(int x){return fa[x]=fa[x]==x?x:Get(fa[x]);}
void Put(int x){
    ++res;
    for (int p=now[x];p;p=pre[p]){
        int y=son[p];
        if (!in[y]) continue;
        int w=Get(y);
        if (x!=w) fa[w]=x,--res;
    }
    in[x]=1;
}
void Work(){
    for (int i=0;i<n;++i) fa[i]=i;
    for (int i=0;i<n;++i) if (!v[i]) Put(i);
    ans[k+1]=res;
    for (int i=k;i>=1;--i) Put(des[i]),ans[i]=res;
    for (int i=1;i<=k+1;++i) printf("%d\n",ans[i]);
}
int main(){
    Init();
    Work();
    return 0;
}

my code

OJ1009剑圣的逃跑

  f[i][j][k]代表当前在(i,j)已使用k次疾风步的最小伤害。

var
  i,ci,j,k,m,n,q,minn,t:longint;
  a:array[0..202,0..404]of longint;
  f:array[0..202,0..404,0..202]of integer;

function min(a,b:longint):longint;
begin
  if a>=b then min:=b
  else min:=a;
end;

begin
  readln(n,q);
  readln(m);
  for i:=1 to n do
    begin
      for j:=1 to i*2-1 do
        read(a[i,j]);
      readln;
    end;
  fillchar(f,sizeof(f),$7f);
  f[1,1,1]:=0;
  f[1,1,0]:=a[1,1];
  for i:=1 to n-1 do
    for j:=1 to i*2-1 do
      for k:=0 to q do
        for t:=0 to 2 do
          f[i+1,j+t,k]:=min(min(f[i+1,j+t,k],f[i,j,k-1]),f[i,j,k]+a[i+1,j+t]);
  minn:=maxlongint;
  for i:=1 to n*2-1 do
    if f[n,i,q]<minn then
        minn:=f[n,i,q];
  if minn>=m then
     writeln(‘DEAD‘)
  else
     writeln(m-minn);
end.

my code

OJ1011选数

  差分约束系统。可以参照:http://ycool.com/post/m2uybbf

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
/*
    令sum[i]代表i及之前选了多少个点
    对于条件(a,b,c),即可化为
        sum[b]-sum[a-1]>=c
    还存在条件
        sum[i]-sum[i-1]>=0
        sum[i]>=0
    转化为 sum[b]>=c+sum[a-1].
    比较最长路三角不等式,dis[b]>=dis[a-1]+w(a-1,b)。
    于是可以令0点dis=0,并连接0和每个i,边权为0
    对于条件(a,b,c),连边(a-1,b,c)。
    做最长路即可。
*/
const int maxn=100015,maxm=500015;
int n,tot,now[maxn],pre[maxm],son[maxm],val[maxm];
void connect(int u,int v,int w){pre[++tot]=now[u];now[u]=tot;son[tot]=v;val[tot]=w;}
void init(){
    scanf("%d",&n);
    for (int u,v,w,i=1;i<=n;++i){
        scanf("%d%d%d",&u,&v,&w);
        ++u;++v;
        connect(u-1,v,w);
    }
    for (int i=1;i<=50001;++i){
        connect(0,i,0);
        connect(i,i+1,0);
        connect(i,i-1,-1);
    }
}
/*
    wa了 好像漏了一个条件
    sum[i]-sum[i-1]<=1
    即sum[i-1]-sum[i]>=-1
    即dis[i-1]>=dis[i]-1
    连接(i,i-1,-1)。
*/
bool inq[maxn];
int head,tail,q[maxn],dis[maxn];
void spfa(int s){
    memset(dis,200,sizeof(dis));
    dis[s]=0;q[1]=s;head=0;tail=1;inq[s]=1;
    while (head!=tail){
        if (++head==maxn) head=1;
        int u=q[head];
        for (int p=now[u];p;p=pre[p])
            if (dis[son[p]]<dis[u]+val[p]){
                dis[son[p]]=dis[u]+val[p];
                if (!inq[son[p]]){
                    if (++tail==maxn) tail=1;
                    q[tail]=son[p];inq[son[p]]=1;
                }
            }
        inq[u]=0;
    }
}
void work(){
    spfa(0);
    printf("%d\n",dis[50002]);
}
int main(){
    freopen("data11.in","r",stdin);
    init();
    work();
    return 0;
}

my code

OJ1012酒鬼

  DP。f[i][j]代表当前做到前i瓶,上一个没喝的瓶在i-j。

  f[i][0]=max(f[i-1][0],f[i-1][1],f[i-1][2])。

  f[i][1]=f[i-1][0]+v[i]。

  f[i][2]=f[i-1][1]+v[i]。

  ans=max(f[n][0],f[n][1],f[n][2])。

var
    f:array[0..1000,0..2] of longint;
    i,v:longint;
function max(a,b,c:longint):longint;
begin
    if a>b then max:=a
    else max:=b;
    if c>max then max:=c;
end;
begin
    readln(i);
    for i:=1 to i do
    begin
        readln(v);
        f[i,0]:=max(f[i-1,0],f[i-1,1],f[i-1,2]);
        f[i,1]:=f[i-1,0]+v;
        f[i,2]:=f[i-1,1]+v;
    end;
    writeln(max(f[i,0],f[i,1],f[i,2]));
end.

my code

待更新。

时间: 2024-10-03 20:41:29

内网OJ题解的相关文章

vpn+squid搞定内网才能访问的svn

业精于勤荒于嬉,愿程序猿们鼓起干劲,坚持学下去! 目录 前言 一.squid安装和使用 二.本机的svn代理设置 前言 今天由于要修改公司项目的配置文件,于是不得不秒登vpn,登上svn跳板机,把要修改的文件update下来.修改完成后,在跳板机上传,最后再经过几道程序,终于更新到线上了. 对于不能在个人电脑上update公司svn的代码,着实有些不方便.当然公司是为了代码安全考虑,多加一点防范,我们是可以理解的. 于是,又开始琢磨怎么把svn的代码搞到本机.其实,这问题蛮简单的,只要对于网络知

100.64.0.0/10是用于运营商级NAT内网保留地址段,即CGN(carrier-grade NAT)

100.64.0.0/10 内网保留段,用于运营商级NAT即CGN(carrier-grade NAT),参见2012年4月所公布的RFC 6598文件 江苏公网IP地址不够, 今年已经采用这一段IP分配给用户了 http://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml

持续集成(二)工具搭建篇—内网邮件服务器搭建

在我们的持续构建中,项目构建中出现错误提醒,或者开发人员之间的沟通交流,进度汇报的事务,都是离不开一个通信工具,那就是邮件.在我们的项目开发中如果使用第三方的邮件平台,这肯定不是最好的选择,因为第三方的邮件需要外网的支持,但是外网又不是特别的可靠,假如外网链接出现了问题,这样就会不必要的延误我们的工期.再或者很多项目都是保密项目,在开发中只能用内网.但是不用邮件吧又不行.为了解决这个头疼的问题,我们的内网邮件服务器工具就出现了,只要用它安装在我们的服务器上,配置好账户,配置好客户端,在内网里就可

linux服务器外网内网(双网络)搭建

一共有2台服务器,分别用a,b表示.a双网卡,即有外网也有内网.b只有内网环境.a,b的内网是通过交换机组建.至于外网怎么搭建我就不说了.关键说一说内网是怎么组建的. 如果你对linux不熟悉,对网卡配置文件不熟悉的话,可能会踩到不少坑.不过你也可能会很顺利的就把这个内网组建起来.下面说说步骤: 1.a,b分别用网线与交换机连起来. 2.a,b的内网ip都设成同一个号段(例如 : a:192.168.1.2  b:192.168.1.3 ) 完成以上步骤然后互ping一下,如果通了就说明你的内网

通过rinetd实现port转发来訪问内网的服务

一.   问题描写叙述 通过外网来訪问内网的服务 二.   环境要求 须要有一台能够外网訪问的机器做port映射.通过数据包转发来实现外部訪问阿里云的内网服务 三.   操作方法 做port映射的方案有非常多.Linux下的ssh tunnel和windows下的portmap等等,这里分享一个更稳定和简单的小工具rinetd 四.   下载安装 $ wget http://www.boutell.com/rinetd/http/rinetd.tar.gz $ tar -xvf rinetd.t

内网IP和外网IP

1.什么是内网内网就是局域网,比如一个公司的局域网,局域网内每台计算机的IP地址是互异的,但不同局域网内的IP是可以相同的.2.什么是外网外网就是互联网,内网的所有计算机都是连接到一个外网IP,通过外网IP对外交换数据.内网的IP地址不同,但共用一个外网IP.两个IP同时存在,一个对内,一个对外.3.NATNAT(Network Address Translation,网络地址转换)是路由器的主要功能,负责内网IP和外网IP之间的转换.属于一种接入广域网(WAN)的技术.NAT解决了IP地址不足

内网IP环境搭建的ERP/OA/CRM如何实现远程互访?

前言 大多数企业都会在公司总部搭建各类项目管理办公系统(如OA.ERP.CRM.收银系统等等)进行运作管理,以提高员工的办公效率及提升企业的管理水平. 但随着公司的不断发展扩大规模,则会在全国甚至全球设立起分公司.办事处.生产基地.仓储中心等分支机构,而且也会有休假在家.出差在外等需要移动办公人员. 面对数量众多并且分散在各地的分支机构,要如何实现访问到公司总部所搭建的办公系统呢?接下来就由小编来给大家支几招,如何通过Oray的产品化解以上企业常见难题. 一.花生壳域名解析软件 http://h

内网渗透+基础+工具使用=自己理解

目录 1.代理 2.内网命令 3.抓密码 4.ipc$共享目录利用 5.端口漏洞 6.溢出 1.代理 端口转发工具有很多比如:rebind2  eDuh  ssock  reDuh  lcx  socks5 等--.. 下面介绍我比较喜欢的2款工具LCX+ socks5 1.lcx 路由器加端口 TCP协议 ,固定IP地址本机 大马设置 Local Ip : 转发ip Local Port : 转发端口 Remote Ip :本机ip (ip138.com外网ip) Remote Port :

配置树莓派3和局域网NTP服务器实现内网时间校准

一.配置局域网NTP服务器 1.安装ntp-4.2.8p5-win32-setup.exe 下载地址:https://www.meinbergglobal.com/english/sw/ntp.htm按默认步骤安装即可. 2.修改配置文件ntp.conf 配置文件默认路径为:C:\Program Files (x86)\NTP\etc\ntp.conf去掉 [plain] view plain copy #server 127.127.1.0 #fudge 127.127.1.0 stratum