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 }
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 }
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 }
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 }
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 }
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 }
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 }