• 2019/12/22 TZOJ


    4986 Team Formation

    http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=4986

    问有几个使得a⊕b>max(a,b)成立的a、b。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 int num[35];
     5 int a[100005];
     6 int get_id(int x)
     7 {
     8     int i;
     9     for(i=0;1<<i<=x;i++);
    10     return i;
    11 }
    12 void init()
    13 {
    14     memset(num,0,sizeof(num));
    15 }
    16 int main()
    17 {
    18     int t;scanf("%d",&t);
    19     while(t--)
    20     {
    21         init();
    22         int n;scanf("%d",&n);
    23         for(int i=0;i<n;i++)
    24         {
    25             scanf("%d",&a[i]);
    26             num[get_id(a[i])]++;
    27         }
    28         //for(int i=0;i<30;i++) printf("%d%c",num[i],i<29?' ':'
    ');
    29         ll ans=0;
    30         for(int i=0;i<n;i++)
    31         {
    32             if(a[i]>0&&a[i]%2==0) ans+=num[0];
    33             for(int j=0;1<<(j)<a[i];j++)
    34                 if((a[i]^(1<<(j)))>a[i]) ans+=num[j+1];
    35         }
    36         printf("%lld
    ",ans);
    37     }
    38 }
    View Code

    1540 Build The Electric System

    http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=1540

    并查集模板套一下。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 struct p{
     5     int a,b,c;
     6     friend bool operator < (p x,p y)
     7     {
     8         return x.c<y.c;
     9     }
    10 }e[124755];
    11 int fin[505];
    12 int findx(int x)
    13 {
    14     return x==fin[x]?x:fin[x]=findx(fin[x]);
    15 }
    16 bool merge(int a,int b)
    17 {
    18     int A=findx(a),B=findx(b);
    19     if(A!=B)
    20     {
    21         fin[A]=B;
    22         return true;
    23     }
    24     return false;
    25 }
    26 void init()
    27 {
    28     memset(fin,0,sizeof(fin));
    29     for(int i=0;i<=500;i++) fin[i]=i;
    30 }
    31 int main()
    32 {
    33     int t;scanf("%d",&t);
    34     while(t--)
    35     {
    36         init();
    37         int n,E;scanf("%d%d",&n,&E);
    38         for(int i=0;i<E;i++)
    39         {
    40             scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].c);
    41             if(e[i].c==0) fin[e[i].a]=e[i].b;
    42         }
    43         sort(e,e+E);
    44         ll ans=0;
    45         for(int i=0;i<E;i++)
    46         {
    47             if(merge(e[i].a,e[i].b)) ans+=e[i].c;
    48         }
    49         printf("%lld
    ",ans);
    50     }
    51 }
    View Code

    1594 Optimal Milking

    http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=1594

    最大流。k个挤奶机最大流量为记m。

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 #define INF 0x3f3f3f3f
      4 #define N 255
      5 struct p{
      6     int to,next;
      7     int cap;
      8 }e[200005];
      9 int k,c,m,n,s,t,cnt;
     10 int ma[N][N];
     11 int deep[N],cur[N];
     12 void add(int u,int v,int f)
     13 {
     14     e[cnt].to=v;
     15     e[cnt].cap=f;
     16     e[cnt].next=cur[u];
     17     cur[u]=cnt++;
     18 
     19     e[cnt].to=u;
     20     e[cnt].cap=0;
     21     e[cnt].next=cur[v];
     22     cur[v]=cnt++;
     23 }
     24 int bfs()
     25 {
     26     memset(deep,-1,sizeof(deep));
     27     deep[s]=0;
     28     queue<int> qu;
     29     qu.push(s);
     30     while(!qu.empty())
     31     {
     32         int u=qu.front();qu.pop();
     33         //printf("%d
    ",u);
     34         for(int v=cur[u];v!=-1;v=e[v].next)
     35             if(deep[e[v].to]<0&&e[v].cap>0)
     36             {
     37                 //printf("%d ",i);
     38                 qu.push(e[v].to);
     39                 deep[e[v].to]=deep[u]+1;
     40             }
     41     }
     42     return deep[n+1]>0;
     43 }
     44 int dfs(int u,int flow)
     45 {
     46     if(u==t) return flow;
     47     int res=0;
     48     for(int v=cur[u];v!=-1&&flow;v=e[v].next)
     49     {
     50         if(e[v].cap&&deep[e[v].to]==deep[u]+1)
     51         {
     52             int minn=dfs(e[v].to,min(flow,e[v].cap));
     53             e[v].cap-=minn;
     54             e[v^1].cap+=minn;
     55             flow-=minn;
     56             res+=minn;
     57         }
     58     }
     59     if(!res) deep[u]=-2;
     60     return res;
     61 }
     62 int dinic()
     63 {
     64     int res=0;
     65     while(bfs()) res+=dfs(s,1<<30);
     66     return res;
     67 }
     68 void init()
     69 {
     70     memset(cur,-1,sizeof(cur));
     71     cnt=0;
     72 }
     73 int main()
     74 {
     75     scanf("%d%d%d",&k,&c,&m);
     76     n=k+c;
     77     for(int i=1;i<=n;i++)
     78     {
     79         for(int j=1;j<=n;j++)
     80         {
     81             scanf("%d",&ma[i][j]);
     82             if(i!=j&&ma[i][j]==0) ma[i][j]=INF;
     83         }
     84     }
     85     for(int l=1;l<=n;l++)
     86         for(int i=1;i<=n;i++)
     87             for(int j=1;j<=n;j++)
     88                 ma[i][j]=min(ma[i][j],ma[i][l]+ma[l][j]);
     89     int left=0,right=200*n;
     90     s=0,t=n+1;
     91     while(right>left+1)
     92     {
     93         int mid=(right+left)>>1;
     94         init();
     95         for(int i=1;i<=k;i++) add(s,i,m);
     96         for(int i=k+1;i<=n;i++) add(i,t,1);
     97         for(int i=1;i<=k;i++)
     98             for(int j=k+1;j<=n;j++)
     99                 if(ma[i][j]&&ma[i][j]<=mid) add(i,j,ma[i][j]);
    100         int res=dinic();
    101         if(res==c) right=mid;
    102         else left=mid;
    103     }
    104     printf("%d
    ",right);
    105 }
    View Code

    3794 Kagome Kagome 

    http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=3794

    其实题目没看懂,看着样例推了一下,就当鬼人往后数n/2即可。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define INF 0x3f3f3f3f
     4 int main()
     5 {
     6     int t;scanf("%d",&t);
     7     while(t--)
     8     {
     9         string p[105];
    10         int n,cnt=0;string name,s;
    11         cin>>n>>name;
    12         int mark=n/2;
    13         for(int i=0;i<n;i++)
    14         {
    15             cin>>p[i];
    16             if(p[i]==name) mark+=i;
    17         }
    18         cout<<p[mark%n]<<endl;
    19     }
    20 }
    View Code

    1547 Kinds of Fuwas

    http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=1547

    狠狠狠狠很耗!用了个三维数组。f[k][i][j]表示k个福娃在第i列和第j列有存在的有几对,然后排列组合取俩。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 ll f[6][255][255];
     5 char ma[255][255];
     6 vector<int> vec[6];
     7 int main()
     8 {
     9     int t;scanf("%d",&t);
    10     while(t--)
    11     {
    12         memset(f,0,sizeof(f));
    13         int n,m;scanf("%d%d",&n,&m);
    14         for(int i=0;i<n;i++)
    15         {
    16             getchar();
    17             for(int j=0;j<m;j++)
    18             {
    19                 scanf("%c",&ma[i][j]);
    20                 for(int k=0;k<j;k++)
    21                 {
    22                     if(ma[i][k]==ma[i][j])
    23                     {
    24                         int num;
    25                         if(ma[i][j]=='B') num=0;
    26                         else if(ma[i][j]=='J') num=1;
    27                         else if(ma[i][j]=='H') num=2;
    28                         else if(ma[i][j]=='Y') num=3;
    29                         else if(ma[i][j]=='N') num=4;
    30                         f[num][k][j]++;
    31                     }
    32                 }
    33             }
    34         }
    35         ll ans=0;
    36         for(int k=0;k<5;k++)
    37             for(int i=0;i<m;i++)
    38                 for(int j=i+1;j<m;j++)
    39                     if(f[k][i][j])
    40                     {
    41                         ans+=f[k][i][j]*(f[k][i][j]-1)/2;
    42                     }
    43         printf("%lld
    ",ans);
    44     }
    45 }
    View Code

    2821 Dream City

    http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=2821

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define INF 0x3f3f3f3f
     4 struct p{
     5     int a,b;
     6     friend bool operator < (p x,p y)
     7     {
     8         if(x.b==y.b) return x.a<y.a;
     9         return x.b<y.b;
    10     }
    11 }tree[255];
    12 int dp[255][255];
    13 int main()
    14 {
    15     int t;scanf("%d",&t);
    16     while(t--)
    17     {
    18         memset(dp,0,sizeof(dp));
    19         int n,m;scanf("%d%d",&n,&m);
    20         for(int i=1;i<=n;i++) scanf("%d",&tree[i].a);
    21         for(int i=1;i<=n;i++) scanf("%d",&tree[i].b);
    22         sort(tree+1,tree+n+1);
    23         for(int i=1;i<=n;i++)
    24         {
    25             for(int j=1;j<=m;j++)
    26                 dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+tree[i].a+tree[i].b*(j-1));
    27         }
    28         printf("%d
    ",dp[n][m]);
    29     }
    30 }
    View Code

    1023 Taxi Cab Scheme

    http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=1023

    ma[i][j]表示第i单开完了可以走第j单

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define INF 0x3f3f3f3f
     4 struct p{
     5     int start,cost;
     6     int x1,y1,x2,y2;
     7 }f[505];
     8 int m,ans;
     9 int ma[505][505],vis[505],pre[505];
    10 int get_time(int x1,int y1,int x2,int y2)
    11 {
    12     return abs(x1-x2)+abs(y1-y2);
    13 }
    14 int dfs(int u)
    15 {
    16     for(int v=u;v<m;v++)
    17     {
    18         if(ma[u][v]&&!vis[v])
    19         {
    20             vis[v]=1;
    21             if(dfs(pre[v])||!pre[v])
    22             {
    23                 pre[v]=u;
    24                 return 1;
    25             }
    26         }
    27     }
    28     return 0;
    29 }
    30 void init()
    31 {
    32     memset(ma,0,sizeof(ma));
    33     memset(pre,0,sizeof(pre));
    34     ans=m;
    35 }
    36 int main()
    37 {
    38     int t;scanf("%d",&t);
    39     while(t--)
    40     {
    41         scanf("%d",&m);
    42         init();
    43         for(int i=0;i<m;i++)
    44         {
    45             int hh,mm,x1,y1,x2,y2;
    46             scanf("%d:%d%d%d%d%d",&hh,&mm,&f[i].x1,&f[i].y1,&f[i].x2,&f[i].y2);
    47             f[i].start=hh*60+mm;
    48             f[i].cost=get_time(f[i].x1,f[i].y1,f[i].x2,f[i].y2);
    49             for(int j=0;j<i;j++)
    50                 if((f[j].start+f[j].cost+get_time(f[i].x1,f[i].y1,f[j].x2,f[j].y2))+1<=f[i].start)
    51                     ma[j][i]=1;
    52         }
    53         for(int i=0;i<m;i++)
    54         {
    55             memset(vis,0,sizeof(vis));
    56             ans-=dfs(i);
    57         }
    58         printf("%d
    ",ans);
    59     }
    60 }
    View Code

     

  • 相关阅读:
    数据类型及用法
    NFS与SSH
    nginx服务,nginx反向代理
    rpm软件包管理
    磁盘分区,文件系统,软链接和硬链接,内存和进程管理
    Linux常用命令,文件目录和权限管理
    操作系统与网络协议(day3)
    计算机基础之硬件简介(Day2)
    QT写串口
    485传输
  • 原文地址:https://www.cnblogs.com/Aaaamber/p/12081207.html
Copyright © 2020-2023  润新知