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?' ':'\n');
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\n",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\n",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\n",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\n",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\n",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\n",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\n",ans);
59     }
60 }
View Code

 

猜你喜欢

转载自www.cnblogs.com/Aaaamber/p/12081207.html