【刷水】之USACO2008资格赛(Bzoj1599-1603)
做之前真是没想到有这么水>.<
但做了还是发上来吧>.<
就当是刷一刷AC量&1A率什么的>.<
Bzoj1599: [Usaco2008 Oct]笨重的石子
枚举。。
1 #include<cstdio> 2 int a,b,c; 3 int t[100]; 4 5 int main(){ 6 scanf("%d%d%d",&a,&b,&c); 7 for(int i=1;i<=a;i++) 8 for(int j=1;j<=b;j++) 9 for(int k=1;k<=c;k++) 10 t[i+j+k]++; 11 int ans=0,ansx=0; 12 for(int i=3;i<=a+b+c;i++) 13 if(t[i]>ans) ans=t[i],ansx=i; 14 printf("%d\n",ansx); 15 return 0; 16 }
Bzoj1600: [Usaco2008 Oct]建造栅栏
组成四边形的充要条件是三边之和大于第四边
也就是任意一边不超过总长的一半(N边形也适用)
然后枚举一下第二次切在哪,两边讨论一下得出这种情况的贡献
时间O(n),空间O(1)
网上的题解貌似都是背包,但那样就是n^2了。。
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int n,lim,ans; 5 6 int main(){ 7 scanf("%d",&n); 8 lim=(n+1)/2; 9 10 for(int i=2;i<=n-2;i++){ 11 int a=lim,b=i-lim,c=i+lim,d=n-lim; 12 a=min(i,a),c=min(n,c); 13 b=max(0,b),d=max(i,d); 14 ans+=(a-b-1)*(c-d-1); 15 } 16 printf("%d\n",ans); 17 return 0; 18 }
Bzoj1601: [Usaco2008 Oct]灌水
这道题以前做了,新加一个点然后最小生成树。
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=305; 5 6 int p[maxn]; 7 int find(int x){return p[x]==x?x:p[x]=find(p[x]);} 8 struct edge{ 9 int u,v,w; 10 bool operator <(const edge&a) 11 const {return w<a.w;} 12 }e[maxn*maxn+maxn]; 13 int n,k; 14 15 int main(){ 16 scanf("%d",&n); 17 for(int i=0;i<=n;i++) p[i]=i; 18 int w; 19 20 for(int i=1;i<=n;i++){ 21 scanf("%d",&w); 22 e[++k].u=0,e[k].v=i; 23 e[k].w=w; 24 } 25 for(int i=1;i<=n;i++) 26 for(int j=1;j<=n;j++){ 27 scanf("%d",&w); 28 e[++k].u=i,e[k].v=j; 29 e[k].w=w; 30 } 31 sort(e+1,e+k+1); 32 33 long long ans=0; 34 for(int i=1;i<=k;i++){ 35 int x=find(e[i].u),y=find(e[i].v); 36 if(x!=y) p[x]=y,ans+=e[i].w; 37 } 38 39 printf("%lld\n",ans); 40 return 0; 41 }
Bzoj1602: [Usaco2008 Oct]牧场行走
模板题,复习倍增。
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=1e3+5; 5 int n,q; 6 7 int head[maxn],e[maxn*2],w[maxn*2],nxt[maxn*2],k; 8 int adde(int u,int v,int g){ 9 e[++k]=v;w[k]=g;nxt[k]=head[u];head[u]=k; 10 e[++k]=u;w[k]=g;nxt[k]=head[v];head[v]=k; 11 } 12 int dep[maxn],dist[maxn],p[maxn][10]; 13 14 int dfs(int u){ 15 for(int i=1;i<10;i++) 16 p[u][i]=p[p[u][i-1]][i-1]; 17 for(int i=head[u];i;i=nxt[i]){ 18 int v=e[i]; 19 if(v==p[u][0]) continue; 20 dist[v]=dist[u]+w[i]; 21 dep[v]=dep[u]+1; 22 p[v][0]=u; 23 dfs(v); 24 } 25 } 26 27 int lca(int u,int v){ 28 if(dep[u]<dep[v]) swap(u,v); 29 int del=dep[u]-dep[v]; 30 for(int i=0;i<10;i++) 31 if(del&(1<<i)) u=p[u][i]; 32 if(u==v) return v; 33 for(int i=9;i>=0;i--) 34 if(p[u][i]!=p[v][i]) 35 u=p[u][i],v=p[v][i]; 36 return p[u][0]; 37 } 38 39 int main(){ 40 scanf("%d%d",&n,&q); 41 int u,v,g; 42 for(int i=1;i<n;i++) 43 scanf("%d%d%d",&u,&v,&g), 44 adde(u,v,g); 45 46 dfs(1); 47 48 for(int i=1;i<=q;i++){ 49 scanf("%d%d",&u,&v); 50 printf("%d\n",dist[u]+dist[v]-2*dist[lca(u,v)]); 51 } 52 return 0; 53 }
Bzoj1603: [Usaco2008 Oct]打谷机
顺序并不会影响什么,然后直接来。。
1 #include<cstdio> 2 int n,a,b,c,ans; 3 int main(){ 4 scanf("%d",&n); 5 for(int i=1;i<n;i++){ 6 scanf("%d%d%d",&a,&b,&c); 7 ans^=c; 8 } 9 printf("%d\n",ans); 10 return 0; 11 }
也不知道做这些题意义何在
然而玩水真是欢乐