• {暑假集训}


    7.12

    错过。。。

    7.14

    https://vjudge.net/contest/170300#overview

    D - Reading Digits

     Gym - 101164D

    暴力往前推到初始时的串,输出指定位置即可。

     1 #include <cstdio>
     2 #include <bits/stdc++.h>
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     string s,t;
     8     int n,k;
     9     scanf("%d%d",&n,&k);
    10     cin>>s;
    11     for(int i=0;i<n;i++)
    12     {
    13         int len=s.length();
    14         t="";
    15         for(int j=0;j<len;j++)
    16         {
    17             int a=s[j]-'0';
    18             int k=0;
    19             while(k<a) t+=s[j+1],k++;
    20             j++;
    21         }
    22         s=t;
    23     }
    24     cout<<s[k]<<endl;
    25 }
    View Code

    G - Pokemons

     Gym - 101164G 

    没有想到在线直接处理,一直爆内存。。。怎么那么弱啊

     1 #include <cstdio>
     2 #include <bits/stdc++.h>
     3 using namespace std;
     4 double m;
     5 int n;
     6 
     7 int main()
     8 {
     9     scanf("%lf%d",&m,&n);
    10     double minp,curp;
    11     double ans=0;
    12     scanf("%lf",&minp);
    13     for(int i=1;i<n;i++)
    14     {
    15         scanf("%lf",&curp);
    16         if(i==1)
    17         {
    18             ans=(curp-minp)/minp*m;
    19         }
    20         if(curp<minp) minp=curp; //维护当前最小进价
    21         else ans=max(ans,(curp-minp)/minp*m);  //当前最大收益
    22     }
    23     printf("%.2lf
    ",ans);
    24 }
    View Code

    I - Cubes

     Gym - 101164I 

    dfs+剪枝

     1 #include <cstdio>
     2 #include <bits/stdc++.h>
     3 using namespace std;
     4 
     5 int n;
     6 int c[410];
     7 int ans[50],a[50],cnt=50;//预估不会超过50层??
     8 void dfs(int d,int n,int k)
     9 {
    10     if(n==0)
    11     {
    12         cnt=d;
    13         for(int i=1;i<=cnt;i++) a[i]=ans[i];
    14     }
    15     if(d+1>=cnt||d+n/c[k]>=cnt) return ;
    16     for(int j=k;j>=1;j--)  if(c[j]<=n)
    17     {
    18         ans[d+1]=j;
    19         dfs(d+1,n-c[j],j);
    20     }
    21 }
    22 int main()
    23 {
    24     scanf("%d",&n);
    25     for(int i=1;i<=400;i++) c[i]=i*i*i;
    26     dfs(0,n,400);
    27     printf("%d
    ",cnt);
    28     for(int i=1;i<cnt;i++) printf("%d ",a[i]);
    29     printf("%d
    ",a[cnt]);
    30 }
    View Code

    7.16

    https://vjudge.net/contest/171164#overview

    A - Rearranging a Sequence

     Gym - 101158A

    看到先进后出就用栈做了

     1 #include <cstdio>
     2 #include <bits/stdc++.h>
     3 using namespace std;
     4 
     5 int n,m;
     6 stack <int> s;
     7 int vis[200010];
     8 int main()
     9 {
    10     scanf("%d%d",&n,&m);
    11     int cnt=0;
    12     for(int i=0;i<m;i++)
    13     {
    14         int x;
    15         scanf("%d",&x);
    16         s.push(x);
    17         if(!vis[x])
    18         {
    19             vis[x]=1;
    20             cnt++;
    21         }
    22     }
    23     for(int i=0;i<cnt;i++)
    24     {
    25        while(vis[s.top()]==2) s.pop();
    26         printf("%d
    ",s.top());
    27         vis[s.top()]=2;
    28         s.pop();
    29     }
    30     for(int i=1;i<=n;i++)
    31         if(!vis[i]) printf("%d
    ",i);
    32 }
    View Code

    B - Quality of Check Digits

     Gym - 101158B 

    没有什么比读错题更坑了,,还是两次读错

    题目中没有说只有主对角线有0,但是给的例子都是只有主对角线是0(最后一个忽略),导致判断时出错一直WA在31

    代码写的比较丑,凑和吧=_=||

      1 #include <cstdio>
      2 #include <bits/stdc++.h>
      3 using namespace std;
      4 const int maxn=10010;
      5 int tb2[10][10];
      6 
      7 int e[maxn];
      8 
      9 int main()
     10 {
     11     for(int i=0;i<10;i++)
     12        for(int j=0;j<10;j++)
     13         scanf("%d",&tb2[i][j]);
     14     for(int i=0;i<10000;i++)
     15     {
     16         int a=i/1000;
     17         int b=i%1000/100;
     18         int c=i%100/10;
     19         int d=i%10;
     20         int x=tb2[0][a];
     21         int y=tb2[x][b];
     22         x=tb2[y][c];
     23         y=tb2[x][d];
     24         e[i]=y;
     25     }
     26     int cnt=0;
     27     for(int i=0;i<10000;i++)
     28     {
     29         int flag=0;
     30         int a=i/1000;
     31         int b=i%1000/100;
     32         int c=i%100/10;
     33         int d= i%10;
     34         for(int j=0;j<10&&!flag;j++) if(j!=e[i])
     35         {
     36             if(tb2[e[i]][j]==0)
     37             {
     38                 cnt++;
     39                 flag=1;
     40                 break;
     41             }
     42         }
     43         for(int j=0;j<10&&!flag;j++) if(j!=a)
     44         {
     45             int x=j*1000+b*100+c*10+d;
     46             if(tb2[e[x]][e[i]]==0)
     47             {
     48                 cnt++;
     49                 flag=1;
     50                 break;
     51             }
     52         }
     53          for(int j=0;j<10&&!flag;j++) if(j!=b)
     54         {
     55             int x=j*100+a*1000+c*10+d;
     56             if(tb2[e[x]][e[i]]==0)
     57             {
     58                 cnt++;
     59                 flag=1;
     60                 break;
     61             }
     62         }
     63          for(int j=0;j<10&&!flag;j++) if(j!=c)
     64         {
     65             int x=j*10+a*1000+b*100+d;
     66             if(tb2[e[x]][e[i]]==0)
     67             {
     68                 cnt++;
     69                 flag=1;
     70                 break;
     71             }
     72         }
     73          for(int j=0;j<10&&!flag;j++) if(j!=d)
     74         {
     75             int x=j+a*1000+b*100+c*10;
     76             if(tb2[e[x]][e[i]]==0)
     77             {
     78                 cnt++;
     79                 flag=1;
     80                 break;
     81             }
     82         }
     83         if(flag) continue;
     84 
     85         int x=b*1000+a*100+c*10+d;
     86         if(a!=b&&tb2[e[x]][e[i]]==0)
     87         {
     88             cnt++;
     89             flag=1;
     90             continue;
     91         }
     92 
     93         x=a*1000+c*100+b*10+d;
     94         if(c!=b&&tb2[e[x]][e[i]]==0)
     95         {
     96             cnt++;
     97             flag=1;
     98             continue;
     99         }
    100         x=a*1000+b*100+c+d*10;
    101         if(c!=d&&tb2[e[x]][e[i]]==0)
    102         {
    103             cnt++;
    104             flag=1;
    105             continue;
    106         }
    107         x=a*1000+b*100+c*10+e[i];
    108         if(d!=e[i]&&tb2[e[x]][d]==0)
    109         {
    110             cnt++;
    111             flag=1;
    112             continue;
    113         }
    114     }
    115     cout<<cnt<<endl;
    116 }
    ugly

    C - Distribution Center

     Gym - 101158C

    并没有做出来。。。差一点

    要记录一下每次机械臂操作后两条生产线的物品总数,上交和下交分开记录,下次交汇时更新用到。

     1 #include <cstdio>
     2 #include <bits/stdc++.h>
     3 using namespace std;
     4 
     5 const int maxn=200010;
     6 int last[maxn][2]; //0为上交,1为下交
     7 int ans[maxn];
     8 
     9 struct node
    10 {
    11     int x,y;
    12     bool operator <(const node & a)const
    13     {
    14         return x<a.x;
    15     }
    16 }arm[maxn];
    17 int n,m;
    18 
    19 int main()
    20 {
    21     scanf("%d%d",&n,&m);
    22     for(int i=0;i<m;i++)
    23         scanf("%d%d",&arm[i].x,&arm[i].y);
    24     sort(arm,arm+m);
    25     for(int i=0;i<=n;i++) ans[i]=1;
    26     for(int i=0;i<m;i++)
    27     {
    28         int a=arm[i].y;
    29         int b=a+1;
    30         int dx=ans[a]-last[a][1];//
    31         int dy=ans[b]-last[b][0];//
    32         ans[a]+=dy;
    33         ans[b]+=dx;
    34         last[a][1]=ans[a];
    35         last[b][0]=ans[b];
    36     }
    37     for(int i=1;i<=n;i++)
    38         printf("%d%c",ans[i],i==n?'
    ':' ');
    39 }
    View Code

    7.18

    https://vjudge.net/contest/171646#overview

    C - Sums

     Gym - 100543C 

    等号右边用求和公式,枚举个数n求得a1

     1 #include <cstdio>
     2 #include <bits/stdc++.h>
     3 using namespace std;
     4 int main()
     5 {
     6     int t;
     7     scanf("%d",&t);
     8     while(t--)
     9     {
    10         int n;
    11         int ok=0;
    12         scanf("%d",&n);
    13         for(int i=2;i<=100000&&(n-(i-1)*i/2)>0;i++)
    14         {
    15             long long temp=(n-(i-1)*i/2);
    16             if(temp%i) continue;
    17             ok=1;
    18             int a1=temp/i;
    19             printf("%d = %d",n,a1);
    20             for(int j=1;j<i;j++)
    21             {
    22                 printf(" + %d",++a1);
    23             }
    24             puts("");
    25             break;
    26 
    27         }
    28         if(!ok) puts("IMPOSSIBLE");
    29     }
    30 }
    View Code

    D - Wheels

     Gym - 100543D

    写的有点拉杂,,就这样吧。。。

     1 #include <cstdio>
     2 #include <bits/stdc++.h>
     3 #define LL long long
     4 using namespace std;
     5 const int maxn=1010;
     6 int n;
     7 struct node
     8 {
     9     int x,y,r;
    10     int id;
    11 }clo[maxn];
    12 int vis[maxn];
    13 queue<node> q[2];
    14 int gcd(int a,int b)
    15 {
    16     return b==0?a:gcd(b,a%b);
    17 }
    18 
    19 double dis(node a,node b)
    20 {
    21     int dx=a.x-b.x;
    22     int dy=a.y-b.y;
    23     return sqrt(dx*dx+dy*dy);
    24 }
    25 void bfs()
    26 {
    27     q[0].push(clo[0]);
    28     clo[0].id=0;
    29     vis[0]=1;
    30     int mask=0;
    31     while(!q[mask].empty())
    32     {
    33         node temp=q[mask].front();
    34         q[mask].pop();
    35         for(int i=0;i<n;i++) if(!vis[i])
    36         {
    37             double d1=dis(temp,clo[i]);
    38             if(d1==temp.r+clo[i].r)
    39             {
    40                 vis[i]=1;
    41                 clo[i].id=mask^1;
    42                 q[mask^1].push(clo[i]);
    43             }
    44         }
    45         if(q[mask].empty()) mask^=1;
    46     }
    47     return ;
    48 }
    49 int main()
    50 {
    51     int t;
    52     scanf("%d",&t);
    53 
    54     while(t--)
    55     {
    56         while(!q[0].empty()) q[0].pop();
    57         while(!q[1].empty()) q[1].pop();
    58         memset(vis,0,sizeof(vis));
    59         scanf("%d",&n);
    60         for(int i=0;i<n;i++)
    61         {
    62             scanf("%d%d%d",&clo[i].x,&clo[i].y,&clo[i].r);
    63             clo[i].id=2;
    64         }
    65         int r=clo[0].r;
    66         bfs();
    67         for(int i=0;i<n;i++)
    68         {
    69             if(clo[i].id==0)
    70             {
    71                 int g=gcd(r,clo[i].r);
    72                 if(r%clo[i].r) printf("%d/%d clockwise
    ",r/g,clo[i].r/g);
    73                 else printf("%d clockwise
    ",r/clo[i].r);
    74             }
    75             else if(clo[i].id==2)
    76             {
    77                 printf("not moving
    ");
    78             }
    79             else if(clo[i].id==1)
    80             {
    81                 int g=gcd(r,clo[i].r);
    82                 if(r%clo[i].r) printf("%d/%d counterclockwise
    ",r/g,clo[i].r/g);
    83                 else printf("%d counterclockwise
    ",r/clo[i].r);
    84             }
    85         }
    86     }
    87 }
    View Code

    H - Good morning!

     Gym - 100543H

    蒟蒻写表过的=_=||......................................................

     1 #include <bits/stdc++.h>
     2 #include <cstdio>
     3 using namespace std;
     4 int ans[10][10]={
     5     0,0,0,0,0,0,10,10,10,10,
     6     10,11,12,13,14,15,16,17,18,19,
     7     20,20,22,23,25,25,26,28,28,29,
     8     29,29,33,33,33,36,36,36,39,39,
     9     40,40,44,44,44,45,46,47,48,49,
    10     50,50,50,55,55,55,56,56,58,59,
    11     59,59,59,66,66,66,66,66,69,69,
    12     70,70,70,70,77,77,77,77,78,79,
    13     80,80,80,80,88,88,88,88,88,89,
    14     89,89,89,89,89,99,99,99,99,99,
    15 };
    16 
    17 int main()
    18 {
    19 
    20    int t;
    21    scanf("%d",&t);
    22    while(t--)
    23    {
    24        char s[5];
    25        cin>>s;
    26        int len=strlen(s);
    27        if(len==1)
    28        {
    29            cout<<s<<endl;
    30            continue;
    31        }
    32        int a=s[len-1]-'0';
    33        int b=s[len-2]-'0';
    34        s[len-2]='';
    35        cout<<s;
    36        printf("%02d
    ",ans[b][a]);
    37 
    38    }
    39 
    40 }
    juruo' code
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 int x[]={4,1,1,1,2,2,2,3,3,3};
     5 int y[]={2,1,2,3,1,2,3,1,2,3};
     6 int A[300];
     7 int cnt=0;
     8 void dfs(int p)
     9 {
    10     if(p>200) return ;
    11     A[cnt++]=p;
    12     for(int i=0;i<10;i++)
    13     {
    14         int t=p%10;
    15         if(x[i]>=x[t]&&y[i]>=y[t])
    16         {
    17             dfs(p*10+i);
    18         }
    19     }
    20 }
    21 
    22 int main()
    23 {
    24     int t;
    25     scanf("%d",&t);
    26     for(int i=1;i<10;i++) dfs(i);
    27     A[cnt++]=0;
    28     sort(A,A+cnt);
    29     while(t--)
    30     {
    31         int n;
    32         scanf("%d",&n);
    33         int ans=0,minn=n;
    34         for(int i=0;i<cnt;i++)
    35         {
    36             if(abs(A[i]-n)<minn)
    37             {
    38                 ans=A[i];
    39                 minn=abs(A[i]-n);
    40             }
    41         }
    42         printf("%d
    ",ans);
    43     }
    44 }
    dalao' code

    I - Bricks

     Gym - 100543I

    场上没写出来,当时判断思路比较混乱

    这是参考了大佬的

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=100010;
     4 
     5 int x[maxn],c[maxn];
     6 int main()
     7 {
     8     int t;
     9     scanf("%d",&t);
    10     while(t--)
    11     {
    12         int n;
    13         char cc;
    14         int b=0,w=0;
    15         int ans=0;
    16         scanf("%d",&n);
    17         for(int i=0;i<n;i++)
    18         {
    19             scanf("%d %c",&x[i],&cc);
    20             if(cc=='W') c[i]=0,w+=x[i];
    21             else c[i]=1,b+=x[i];
    22         }
    23         if(w==0||b==0)
    24         {
    25             printf("%d
    ",w+b);
    26             continue;
    27         }
    28         
    29         int g=__gcd(w,b);
    30         w/=g;b/=g;
    31         int tw=0,tb=0;
    32         
    33         for(int i=0;i<n;i++)
    34         {
    35             if(c[i]) //黑色
    36             {
    37                 tb+=x[i];
    38                 if(tw&&tw%w==0)
    39                 {
    40                     int needb=tw/w*b;
    41                     if(tb-x[i]>=needb) continue;
    42                     if(tb>=needb)
    43                     {
    44                         tb-=needb;
    45                         tw=0;
    46                         ans++;
    47                     }
    48                 }
    49             }
    50             else //白色
    51             {
    52                 tw+=x[i];
    53                 if(tb&&tb%b==0)
    54                 {
    55                     int needw=tb/b*w;
    56                     if(tw-x[i]>=needw) continue;
    57                     if(tw>=needw)
    58                     {
    59                         tw-=needw;
    60                         tb=0;
    61                         ans++;
    62                     }
    63                 }
    64             }
    65         }
    66         printf("%d
    ",ans);
    67     }
    68 }
    View Code

    L - Outer space invaders

     Gym - 100543L 

    区间dp。

    原文链接

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 #define N 605
     4 const int INF = 0x3f3f3f3f;
     5 struct Node {
     6     int l, r, w;
     7 } p[N];
     8 int dp[N][N], x[N];
     9 int main() {
    10     int t; scanf("%d", &t);
    11     while(t--) {
    12         int n; scanf("%d", &n);
    13         int m = 0;
    14         for(int i = 1; i <= n; i++) {
    15             int l, r, w; scanf("%d%d%d", &l, &r, &w);
    16             p[i] = (Node) { l, r, w };
    17             x[++m] = l; x[++m] = r;
    18         }
    19 
    20         sort(x + 1, x + 1 + m);
    21         m = unique(x + 1, x + 1 + m) - x - 1;  //剩余m个元素,下标从1到m
    22 
    23         for(int i = 1; i <= n; i++) {
    24             p[i].l = lower_bound(x + 1, x + 1 + m, p[i].l) - x;
    25             p[i].r = lower_bound(x + 1, x + 1 + m, p[i].r) - x;
    26         }
    27         //  memset(dp, INF, sizeof(dp));
    28         for(int len = 1; len <= m; len++) { // dp[st][ed] 消掉st到ed这段区间的人的花费
    29             for(int st = 1; st <= m - len + 1; st++) {
    30                 int ed = st + len - 1, id = 0;
    31                 for(int i = 1; i <= n; i++) // 找出花费最大的人,这个人只能在属于自己的这段区间解决掉
    32                     if(st <= p[i].l && p[i].r <= ed)
    33                         if(id == 0 || p[i].w > p[id].w) id = i;
    34                 if(id == 0) { dp[st][ed] = 0; continue; }
    35                 dp[st][ed] = INF;
    36                 for(int gap = p[id].l; gap <= p[id].r; gap++) // 枚举在哪一点去炸掉这个人最优,因为这个人不能被dp[st][gap-1]到dp[gap+1][ed]的点消除
    37                     dp[st][ed] = min(dp[st][gap-1] + dp[gap+1][ed] + p[id].w, dp[st][ed]);
    38             }
    39         }
    40         //for(int i = 1; i <= m; i++)
    41         //  for(int j = i; j <= m; j++)
    42         //      printf("dp[%d][%d] : %d
    ", i, j, dp[i][j]);
    43         printf("%d
    ", dp[1][m]);
    44     }
    45     return 0;
    46 }
    COPY

    7.20

    https://vjudge.net/contest/172313

    KM算法相关

    A - 奔小康赚大钱

     HDU - 2255

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int inf=0x3f3f3f3f;
     4 const int maxn=310;
     5 int n;
     6 
     7 int c[maxn][maxn];
     8 int vg[maxn],vb[maxn];
     9 int eb[maxn],eg[maxn];
    10 int mc[maxn];
    11 int d;
    12 
    13 int dfs(int id)
    14 {
    15     vg[id]=1;
    16     for(int i=0;i<n;i++)
    17     {
    18         if(vb[i]) continue;  //只能访问一次
    19         int gap=eg[id]+eb[i]-c[id][i];
    20         if(gap==0)  //有边
    21         {
    22             vb[i]=1;
    23             if(mc[i]==-1||dfs(mc[i]))
    24             {
    25                 mc[i]=id;
    26                 return 1;
    27             }
    28         }
    29         else
    30         {
    31             d=min(d,gap);  //该男最少还需要的期望值
    32         }
    33     }
    34     return 0;
    35 }
    36 
    37 void KM()
    38 {
    39     memset(mc,-1,sizeof(mc));
    40     memset(eg,0,sizeof(eg));
    41     memset(eb,0,sizeof(eb));
    42     for(int i=0;i<n;i++)
    43         for(int j=0;j<n;j++)
    44         eg[i]=max(c[i][j],eg[i]);
    45 
    46     for(int i=0;i<n;i++)
    47     {
    48         while(1)
    49         {
    50             memset(vg,0,sizeof(vg));
    51             memset(vb,0,sizeof(vb));
    52             d=inf;
    53             if(dfs(i)) break;
    54             for(int i=0;i<n;i++)
    55             {
    56                 if(vg[i]) eg[i]-=d;
    57                 if(vb[i]) eb[i]+=d;
    58             }
    59         }
    60     }
    61 }
    62 
    63 int main()
    64 {
    65     while(scanf("%d",&n)!=EOF)
    66     {
    67         memset(c,0,sizeof(c));
    68         for(int i=0;i<n;i++)
    69             for(int j=0;j<n;j++)
    70             scanf("%d",&c[i][j]);
    71         KM();
    72         int ans=0;
    73         for(int i=0;i<n;i++)
    74             ans+=c[mc[i]][i];
    75         printf("%d
    ",ans);
    76     }
    77 
    78 }
    View Code

    B - Going Home

     HDU - 1533

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int inf=0x3f3f3f3f;
     4 const int maxn=110;
     5 
     6 int eg[maxn],eb[maxn],vg[maxn],vb[maxn];
     7 int mc[maxn],d;
     8 int mx[maxn],my[maxn],hx[maxn],hy[maxn];
     9 int c[maxn][maxn];
    10 char g[maxn][maxn];
    11 int n,m;
    12 int ct;
    13 int dfs(int id)
    14 {
    15     vg[id]=1;
    16     for(int i=0;i<ct;i++)
    17     {
    18         if(vb[i]==1) continue;
    19         int gap=eg[id]+eb[i]-c[id][i];
    20         if(gap==0)
    21         {
    22             vb[i]=1;
    23             if(mc[i]==-1||dfs(mc[i]))
    24             {
    25                 mc[i]=id;
    26                 return 1;
    27             }
    28         }
    29         else
    30         {
    31             d=min(d,gap);
    32         }
    33     }
    34     return 0;
    35 }
    36 void KM()
    37 {
    38     memset(mc,-1,sizeof(mc));
    39     memset(eg,-inf,sizeof(eg));
    40     memset(eb,0,sizeof(eb));
    41 
    42     for(int i=0;i<ct;i++)
    43         for(int j=0;j<ct;j++)
    44         eg[i]=max(eg[i],c[i][j]);
    45     for(int i=0;i<ct;i++)
    46     {
    47         while(1)
    48         {
    49             memset(vb,0,sizeof(vb));
    50             memset(vg,0,sizeof(vg));
    51             d=inf;
    52             if(dfs(i)) break;
    53             for(int i=0;i<ct;i++)
    54             {
    55                 if(vg[i]) eg[i]-=d;
    56                 if(vb[i]) eb[i]+=d;
    57             }
    58         }
    59     }
    60 }
    61 int main()
    62 {
    63     while(scanf("%d%d",&n,&m)&&(n||m))
    64     {
    65         memset(c,-inf,sizeof(0));
    66         int cth=0,ctm=0;
    67         for(int i=0;i<n;i++)
    68         {
    69             scanf("%s",g[i]);
    70             for(int j=0;j<m;j++)
    71             {
    72                 if(g[i][j]=='H') {hx[cth]=i;hy[cth++]=j;}
    73                 if(g[i][j]=='m') {mx[ctm]=i;my[ctm++]=j;}
    74             }
    75         }
    76         ct=cth;
    77         for(int i=0;i<ct;i++)
    78             for(int j=0;j<ct;j++)
    79                 c[i][j]=-abs(mx[i]-hx[j])-abs(my[i]-hy[j]);  //m到H的距离
    80         KM();
    81         int ans=0;
    82         for(int i=0;i<ct;i++)
    83             ans+=c[mc[i]][i];
    84         printf("%d
    ",-ans);
    85     }
    86 }
    View Code

    C - Interesting Housing Problem

     HDU - 2426 

    题目又说不会分到不喜欢的房间,,竟然没看到。。。读题读错了是硬伤啊=_=||

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int inf=0x3f3f3f3f;
     4 const int maxn=550;
     5 
     6 int c[maxn][maxn];
     7 int vb[maxn],vg[maxn],eb[maxn],eg[maxn];
     8 int mc[maxn];
     9 int d;
    10 int n,m,r;
    11 
    12 int dfs(int id)
    13 {
    14     vg[id]=1;
    15     for(int i=0;i<m;i++)
    16     {
    17         int gap=eg[id]+eb[i]-c[id][i];
    18         if(vb[i]) continue;
    19         if(gap==0)
    20         {
    21             vb[i]=1;
    22             if(mc[i]==-1||dfs(mc[i]))
    23             {
    24                 mc[i]=id;
    25                 return 1;
    26             }
    27         }
    28         else d=min(d,gap);
    29     }
    30     return 0;
    31 }
    32 
    33 int KM()
    34 {
    35     memset(mc,-1,sizeof(mc));
    36     memset(eb,0,sizeof(eb));
    37     memset(eg,-inf,sizeof(eg));
    38     for(int i=0;i<n;i++)
    39         for(int j=0;j<m;j++)
    40             eg[i]=max(eg[i],c[i][j]);
    41 
    42     for(int i=0;i<n;i++)
    43     {
    44         while(1)
    45         {
    46             memset(vb,0,sizeof(vb));
    47             memset(vg,0,sizeof(vg));
    48             d=inf;
    49             if(dfs(i)) break;
    50             if(d==inf) return -1;
    51             for(int i=0;i<n;i++) if(vg[i]) eg[i]-=d;
    52             for(int j=0;j<m;j++) if(vb[j]) eb[j]+=d;
    53         }
    54     }
    55     int ans=0;
    56     for(int i=0;i<m;i++)
    57     {
    58         if(mc[i]!=-1)
    59         {
    60             if(c[mc[i]][i]!=-inf) ans+=c[mc[i]][i];
    61             else return -1;
    62         }
    63     }
    64     return ans;
    65 }
    66 
    67 int main()
    68 {
    69     int u,v,w;
    70     int kase=0;
    71     while(scanf("%d%d%d",&n,&m,&r)!=EOF)
    72     {
    73        for(int i=0;i<n;i++)
    74         for(int j=0;j<m;j++)
    75         c[i][j]=-inf;
    76         for(int i=0;i<r;i++)
    77         {
    78             scanf("%d%d%d",&u,&v,&w);
    79             if(w>=0) c[u][v]=w;
    80         }
    81         printf("Case %d: %d
    ",++kase,KM());
    82     }
    83 }
    View Code

    D - Special Fish

     HDU - 3395

    KM模板

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int inf=0x3f3f3f3f;
     4 const int maxn=110;
     5 int c[maxn][maxn];
     6 int vb[maxn],vg[maxn],eb[maxn],eg[maxn];
     7 int mc[maxn];
     8 int g[maxn];
     9 int d;
    10 int n;
    11 int dfs(int x)
    12 {
    13     vg[x]=1;
    14     for(int i=0;i<n;i++)
    15     {
    16         if(vb[i]) continue;
    17         int gap=eg[x]+eb[i]-c[x][i];
    18         if(gap==0)
    19         {
    20             vb[i]=1;
    21             if(mc[i]==-1||dfs(mc[i]))
    22             {
    23                 mc[i]=x;
    24                 return 1;
    25             }
    26         }
    27         else d=min(d,gap);
    28     }
    29     return 0;
    30 }
    31 int KM()
    32 {
    33     memset(mc,-1,sizeof(mc));
    34     memset(eb,0,sizeof(eb));
    35     for(int i=0;i<n;i++)
    36     {
    37         eg[i]=c[i][0];
    38         for(int j=1;j<n;j++)
    39             eg[i]=max(c[i][j],eg[i]);
    40     }
    41 
    42     for(int i=0;i<n;i++)
    43     {
    44         while(1)
    45         {
    46             memset(vb,0,sizeof(vb));
    47             memset(vg,0,sizeof(vg));
    48             d=inf;
    49             if(dfs(i)) break;
    50             for(int j=0;j<n;j++) {
    51                 if(vg[j]) eg[j]-=d;
    52                 if(vb[j]) eb[j]+=d;
    53             }
    54         }
    55     }
    56     int ans=0;
    57     for(int i=0;i<n;i++)
    58         ans+=c[mc[i]][i];
    59     return  ans;
    60 }
    61 
    62 int main()
    63 {
    64     char cc[110];
    65     while(scanf("%d",&n)&&n)
    66     {
    67         memset(c,0,sizeof(c));
    68         for(int i=0;i<n;i++)scanf("%d",&g[i]);
    69         for(int i=0;i<n;i++)
    70         {
    71            scanf("%s",cc);
    72             for(int j=0;j<n;j++)
    73             {
    74                 if(cc[j]=='1') c[i][j]=g[i]^g[j];
    75             }
    76         }
    77         printf("%d
    ",KM());
    78     }
    79 
    80 }
    View Code

    F - One fihgt one

     HDU - 2813 

    神坑。。。string超时,char就过了。。。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int inf=0x3f3f3f3f;
     4 const int maxn=210;
     5 int c[maxn][maxn];
     6 int vb[maxn],vg[maxn],eb[maxn],eg[maxn];
     7 int mc[maxn];
     8 int d;
     9 map<string,int> mp;
    10 int n,m,k;
    11 
    12 int dfs(int id)
    13 {
    14     vg[id]=1;
    15     for(int i=0;i<m;i++)
    16     {
    17         int gap=eg[id]+eb[i]-c[id][i];
    18         if(vb[i]) continue;
    19         if(gap==0)
    20         {
    21             vb[i]=1;
    22             if(mc[i]==-1||dfs(mc[i]))
    23             {
    24                 mc[i]=id;
    25                 return 1;
    26             }
    27         }
    28         else d=min(d,gap);
    29     }
    30     return 0;
    31 
    32 }
    33 void KM()
    34 {
    35     memset(mc,-1,sizeof(mc));
    36     memset(eg,-inf,sizeof(eg));
    37     memset(eb,0,sizeof(eb));
    38 
    39     for(int i=0;i<n;i++)
    40         for(int j=0;j<m;j++)
    41         eg[i]=max(eg[i],c[i][j]);
    42 
    43     for(int i=0;i<n;i++)
    44     {
    45         while(1)
    46         {
    47             memset(vb,0,sizeof(vb));
    48             memset(vg,0,sizeof(vg));
    49             d=inf;
    50             if(dfs(i)) break;
    51             for(int i=0;i<n;i++) if(vg[i]) eg[i]-=d;
    52             for(int j=0;j<m;j++) if(vb[j]) eb[j]+=d;
    53         }
    54     }
    55 }
    56 
    57 int main()
    58 {
    59     while(scanf("%d%d%d",&n,&m,&k)!=EOF)
    60     {
    61         char s1[55],s2[55];
    62         mp.clear();
    63         int h;
    64         int id1=0,id2=0;
    65         memset(c,-inf,sizeof(c));
    66         for(int i=0;i<k;i++)
    67         {
    68             scanf("%s%s%d",s1,s2,&h);
    69             if(!mp.count(s1)) mp[s1]=id1++;
    70             if(!mp.count(s2)) mp[s2]=id2++;
    71             int u=mp[s1],v=mp[s2];
    72             c[u][v]=-h;
    73         }
    74         KM();
    75         int ans=0;
    76         for(int i=0;i<m;i++) if(mc[i]!=-1)
    77         {
    78             ans+=c[mc[i]][i];
    79         }
    80         printf("%d
    ",-ans);
    81     }
    82 
    83 }
    View Code

    发现这么整理有点乱,后面分开了。。。

  • 相关阅读:
    5个最好用AngularJS构建应用程序框架
    5款最好的免费在线网站CSS验证器
    10款最优秀的开源移动开发工具
    10个最好的免费PS图象处理软件方案
    10个基本的HTML5动画工具设计
    6款最好的免费在线二维码生成器
    Redis配置文件参数说明
    Redis学习手册(主从复制)
    java.lang.OutOfMemoryError: PermGen space PermGen space & java.lang.OutOfMemoryError: Java heap space Heap siz
    TNSNAMES.ORA 配置
  • 原文地址:https://www.cnblogs.com/yijiull/p/7173142.html
Copyright © 2020-2023  润新知