zoukankan      html  css  js  c++  java
  • ZOJ Monthly, June 2012 [7月9日暑假集训]

    比赛地址:

        http://acm.hust.edu.cn:8080/judge/contest/view.action?cid=9231#overview

    F .Choir III  [最大子矩阵]

    ZOJ地址:

        http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3616

    推荐一篇文章:

        http://www.cnblogs.com/fll/archive/2008/05/17/1201543.html

       因为不能选值为负的格子,所以将所有值为负预处理为 - INF。这样问题就变成:求一个矩阵的元素和最大的子矩阵,且满足至少bboy,至少ggirl的问题。枚举行rkO(100*100)的复杂度,将rk行的矩阵压缩成一个向量。再枚举右端点iO(2000)的复杂度。维护当前值sumnumlen(以第i列结束的向量的最大值,向量包含的女生数,向量的长度),不断更新maxv

     

    F . Choir III
     1 //zzy2012.7.9AC
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cstdlib>
     5 #include<string>
     6 #include<cmath>
     7 #include<iostream>
     8 #include<algorithm>
     9 #include<map>
    10 #include<vector>
    11 #include<queue>
    12 #define sf scanf
    13 #define pf printf
    14 #define pfn printf("\n");
    15 #define ll long long
    16 #define INF 0x7fffffff
    17 
    18 using namespace std;
    19 
    20 typedef struct{
    21     long long v,s;
    22 }node;
    23 
    24 long long n,m,b,g,v[100][2000],s[100][2000],maxv;
    25 node a[2000];
    26 
    27 void D(){
    28     long long len,sum,num,sp;
    29     for(long long r=0; r<n; r++){
    30         for(long long i=0; i<m; i++){
    31             a[i].v=0;
    32             a[i].s=0;
    33         }
    34         for(long long k=r; k<n; k++){
    35             for(long long i=0; i<m; i++){
    36                 a[i].v+=v[k][i];
    37                 a[i].s+=s[k][i];
    38             }
    39             sum=0;
    40             num=0;
    41             len=0;
    42             sp=k-r+1;
    43             for(long long i=0; i<m; i++){
    44                 if(sum>=0){
    45                     sum+=a[i].v;
    46                     num+=a[i].s;
    47                     len++;
    48                 }
    49                 else{
    50                     sum=a[i].v;
    51                     num=a[i].s;
    52                     len=1;
    53                 }
    54                 if(sum>=0){
    55                     if(num>=g && sp*len-num>=b){
    56                         if(sum>maxv)
    57                             maxv=sum;
    58                     }
    59                 }
    60             }
    61         }
    62     }
    63 }
    64 
    65 int main()
    66 {
    67     while(sf("%lld %lld %lld %lld",&n,&m,&b,&g)!=EOF){
    68         for(long long i=0; i<n; i++)
    69             for(long long j=0; j<m; j++){
    70                 sf("%lld %lld",&v[i][j],&s[i][j]);
    71                 if(v[i][j]<0)
    72                     v[i][j]=-INF;
    73                 s[i][j]--;
    74             }
    75         maxv=-1LL;
    76         D();
    77         if(maxv==-1LL)
    78             pf("No solution!\n");
    79         else
    80             pf("%lld\n",maxv);
    81     }
    82     return 0;
    83 }

     

     

    J .Escape Time II  [BFS]

    ZOJ地址:

        http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3620

      房间数很少,边数可能比较多,所以先预处理下边。两个房间之间只记录花费时间最少的边。从前点开始BFS就行。需要注意的是状态压缩。要保存的状态:当前在哪个房间rid,去过了那些房间ar[10]stid值是ar数组状态的二进制压缩。

     

    J . Escape Time II
      1 //zzy2012.7.9AC
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<cstdlib>
      5 #include<string>
      6 #include<cmath>
      7 #include<iostream>
      8 #include<algorithm>
      9 #include<map>
     10 #include<vector>
     11 //#include<queue>
     12 #define sf scanf
     13 #define pf printf
     14 #define pfn printf("\n");
     15 #define ll long long
     16 #define INF 0x7fffffff
     17 
     18 using namespace std;
     19 
     20 typedef struct{
     21     int rid,stid,v,t,ar[10];
     22 }node;
     23 
     24 int n,m,t,s,e,jew[10],way[10][10],front,rear,maxnum,p2[10],st[10][1024][2];//t , v
     25 node queue[1000000];
     26 
     27 void BFS(){
     28     node nd,nd2;
     29     front=rear=0;
     30     nd.rid=s;
     31     nd.v=jew[s];
     32     nd.stid=p2[s];
     33     nd.t=0;
     34     for(int i=0 ;i<n; i++) nd.ar[i]=0;
     35     nd.ar[s]=1;
     36     st[nd.rid][nd.stid][0]=0;
     37     queue[front++]=nd;
     38     while(front>rear){
     39         nd=queue[rear++];
     40         if(nd.t>t) continue;
     41         if(nd.rid==e)
     42             if(nd.v>maxnum) maxnum=nd.v;
     43         for(int i=0; i<n; i++){
     44             if(i==nd.rid) continue;
     45             nd2=nd;
     46             if(way[nd2.rid][i]==-1) continue;
     47             if(nd2.ar[i]==1){
     48                 nd2.t+=way[nd2.rid][i];
     49                 if(nd2.t>t) continue;
     50                 nd2.rid=i;
     51                 if(nd2.t<st[nd2.rid][nd2.stid][0]){
     52                     st[nd2.rid][nd2.stid][0]=nd2.t;
     53                     if(nd2.v>st[nd2.rid][nd2.stid][1])
     54                         st[nd2.rid][nd2.stid][1]=nd2.v;
     55                     queue[front++]=nd2;
     56                 }
     57                 else if(nd2.v>st[nd2.rid][nd2.stid][1]){
     58                     st[nd2.rid][nd2.stid][1]=nd2.v;
     59                     queue[front++]=nd2;
     60                 }
     61             }
     62             else if(nd2.t+way[nd2.rid][i]<=t){
     63                 nd2.ar[i]=1;
     64                 nd2.stid+=p2[i];
     65                 nd2.t+=way[nd2.rid][i];
     66                 nd2.v+=jew[i];
     67                 nd2.rid=i;
     68                 if(st[nd2.rid][nd2.stid][0]>nd2.t){
     69                     st[nd2.rid][nd2.stid][0]=nd2.t;
     70                     if(st[nd2.rid][nd2.stid][1]<nd2.v)
     71                         st[nd2.rid][nd2.stid][1]=nd2.v;
     72                     queue[front++]=nd2;
     73                 }
     74                 else if(st[nd2.rid][nd2.stid][1]<nd2.v){
     75                     st[nd2.rid][nd2.stid][1]=nd2.v;
     76                     queue[front++]=nd2;
     77                 }
     78             }
     79         }
     80     }
     81 }
     82 
     83 int main()
     84 {
     85     int a,b,c;
     86     p2[0]=1;
     87     for(int i=1; i<10; i++) p2[i]=p2[i-1]*2;
     88     //freopen("in.txt","r",stdin);
     89     while(sf("%d %d %d",&n,&m,&t)!=EOF){
     90         sf("%d %d",&s,&e);
     91         for(int i=0; i<n; i++)
     92             sf("%d",jew+i);
     93         for(int i=0; i<n; i++) for(int j=0; j<n; j++) way[i][j]=-1;
     94         for(int i=0; i<m; i++){
     95             sf("%d %d %d",&a,&b,&c);
     96             if(way[a][b]==-1 || way[a][b]>c){
     97                 way[a][b]=c;
     98                 way[b][a]=c;
     99             }
    100         }
    101         maxnum=0;
    102         for(int i=0; i<n; i++) for(int j=0; j<1024; j++) {st[i][j][0]=INF; st[i][j][1]=0;}
    103         BFS();
    104         pf("%d\n",maxnum);
    105     }
    106     return 0;
    107 }

     

     

  • 相关阅读:
    最快的csv文件入到数据库的方法
    (转)CString,int,string,char*之间的转换
    多线程实现
    同时取得架构和表名
    (转)颠覆你对方法调用的看法!
    TabControl控件和TabPage
    GridControl事件
    SharpICTCLAS分词系统简介
    idea maven新建struts2项目
    servlet-mysql实现简单用户登录注册
  • 原文地址:https://www.cnblogs.com/Lattexiaoyu/p/2583843.html
Copyright © 2011-2022 走看看