2017 9 1:
1、 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路
floyd最短路
#include<cstdio> #include<cstring> const int N=105,len=10000+9; int map[N][N]; int a[len]; int main() { int n,m; scanf("%d %d",&n,&m); for(int i=1;i<=m;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&map[i][j]); for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(map[i][k]+map[k][j]<map[i][j]) map[i][j]=map[i][k]+map[k][j]; long long ans=0; int last=1; for(int i=1;i<=m;i++) ans+=map[last][a[i]],last=a[i]; printf("%lld\n",ans); return 0; }
2、1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐(看题解)
一道水题
然而我脑子短路了
竟然没想到怎么写
直接从每个牛的位置dfs一遍
标记一下每个点
然后再看哪些点被标记了K次就可以了
#include<cstdio> #include<cstring> const int K=107,N=1007,M=10005; int first[N],cow[K]; struct node { int to,next; }e[M]; int count[N]; int visit[N]; void dfs(int x) { visit[x]=1;count[x]++; for(int k=first[x];k;k=e[k].next) if(!visit[e[k].to]) dfs(e[k].to); } int main() { int k,n,m; scanf("%d %d %d",&k,&n,&m); for(int i=1;i<=k;i++) scanf("%d",&cow[i]); int u,v; int cnt=0; for(int i=1;i<=m;i++) { scanf("%d %d",&u,&v); e[++cnt].to=v;e[cnt].next=first[u];first[u]=cnt; } int sum=0; for(int i=1;i<=k;i++) { memset(visit,0,sizeof(visit)); dfs(cow[i]); } for(int i=1;i<=n;i++) if(count[i]==k) sum++; printf("%d\n",sum); return 0; }
3、1623: [Usaco2008 Open]Cow Cars 奶牛飞车
贪心
数据范围再大一些可以考虑二分找出符合条件的牛
刚开始cmp函数写错了
写成了min函数QAQ
#include<cstdio> #include<cstring> #include<algorithm> const int N=5*1e4+100; int si[N]; int sum[N]; bool cmp(int a,int b) { return a<b; } int main() { int n,m,d,l; scanf("%d %d %d %d",&n,&m,&d,&l); for(int i=1;i<=n;i++) { scanf("%d",&si[i]); if(si[i]<l) i--,n--; } std::sort(si+1,si+1+n,cmp); int k=1; int ans=0; for(int i=1;i<=n;i++) { while(si[i]-sum[k]*d<l&&i<=n) i++; if(i>n) break; sum[k]++; k++; if(k>m) k=1; ans++; } printf("%d\n",ans); return 0; }
4、1627: [Usaco2007 Dec]穿越泥地
随便打个bfs
每个点只会遍历一次
#include<cstdio> #include<cstring> const int N=1020; bool map[N][N]; bool bo[N][N]; const int len=1e6+5; int qu[len][3]; int x,y,n; int hh[4]={-1,0,0,1},ll[4]={0,1,-1,0}; int sth,stl;; int bfs() { int head=1,tail=2; qu[1][0]=sth,qu[1][1]=stl;qu[1][2]=0; while(head<=tail) { int rr=head++; if(head>len) head=0; // printf("std::%d %d %d\n",qu[rr][0],qu[rr][1],qu[rr][2]); if(qu[rr][0]==x&&qu[rr][1]==y) return qu[rr][2]; for(int i=0;i<4;i++) { int u=qu[rr][0]+hh[i],v=qu[rr][1]+ll[i]; if(!bo[u][v]&&!map[u][v]) { bo[u][v]=1; qu[tail][0]=u;qu[tail][1]=v;qu[tail++][2]=qu[rr][2]+1; if(tail>len) tail=0; } } } } int main() { scanf("%d %d %d",&x,&y,&n); x+=501,y+=501; sth=501,stl=501; int u,v; for(int i=1;i<=n;i++) { scanf("%d %d",&u,&v); map[u+501][v+501]=1; } printf("%d\n",bfs()); return 0; }
2017 9 2:
5、1682: [Usaco2005 Mar]Out of Hay 干草危机
最小生成树
很难受。。。
大水题WA了好几次
有一个地方m写成n了。。。。
#include<cstdio> #include<cstring> #include<algorithm> const int M=10000+17,N=2005; struct node { int to,c,from; }e[M]; int f[N]; int get(int v) { return f[v]==v?v:f[v]=get(f[v]); } int cnt; inline void insert(int u,int v,int c) { e[++cnt].from=u;e[cnt].to=v;e[cnt].c=c; } bool cmp(node a,node b) { return a.c<b.c; } int main() { int n,m; scanf("%d %d",&n,&m); int u,v,c; for(int i=1;i<=m;i++) { scanf("%d %d %d",&u,&v,&c); insert(u,v,c); } std::sort(e+1,e+1+m,cmp); for(int i=1;i<=n;i++) f[i]=i; int sum=0; for(int i=1;i<=m;i++) { int x=get(e[i].from),y=get(e[i].to); if(x!=y) { f[x]=y; sum++; if(sum==n-1) { printf("%d\n",e[i].c); return 0; } } } return 0; }6、3403: [Usaco2009 Open]Cow Line 直线上的牛
模拟
#include<cstdio> #include<cstring> const int len=100000*3+100; int qu[len]; inline char read() { char t=getchar(); while(t<'A'||t>'Z') t=getchar(); return t; } int main() { int s; scanf("%d",&s); int head=1e5+1,tail=1e5; int now=1; for(int i=1;i<=s;i++) { char t=read(); if(t=='A') { t=read(); if(t=='L') qu[--head]=now++; else qu[++tail]=now++; } else { int k;t=read(); scanf("%d",&k); if(t=='L') head+=k; else tail-=k; } } while(head<=tail) printf("%d\n",qu[head++]); return 0; }
7、3403: [Usaco2009 Open]Cow Line 直线上的牛
bfs
#include<cstdio> #include<cstring> const int M=50000+100,N=20005,len=1e5; struct node { int to,next; }e[M*2]; int first[N]; int dis[N]; int qu[len]; bool visit[N]; void bfs() { int head=1,tail=2; qu[1]=1; dis[1]=0;visit[1]=1; while(head<=tail) { int rr=qu[head++]; for(int k=first[rr];k;k=e[k].next) if(!visit[e[k].to]) { visit[e[k].to]=1; qu[tail++]=e[k].to; dis[e[k].to]=dis[rr]+1; } } } int main() { int n,m; scanf("%d %d",&n,&m); int cnt=0; int u,v; for(int i=1;i<=m;i++) { scanf("%d %d",&u,&v); e[++cnt].to=v;e[cnt].next=first[u];first[u]=cnt; e[++cnt].to=u;e[cnt].next=first[v];first[v]=cnt; } bfs(); int max=0,sum=0; for(int i=1;i<=n;i++) if(dis[i]>max) max=dis[i],sum=1; else if(dis[i]==max) sum++; for(int i=1;i<=n;i++) if(dis[i]==max) { printf("%d %d %d\n",i,dis[i],sum); return 0; } return 0; } ———————————————————————分割线——————————————————————————————写的这些题都好水啊。。。。。
准备弃坑
去写gold了,,,
2017 9 4:
没事闲的写一题
8、1606: [Usaco2008 Dec]Hay For Sale 购买干草
背包问题变形?
题意好像不是很清楚
我写的是完全背包
我看别人写的是01背包
不过我也过了。。。。
跑了300ms
不知道0ms的是怎么跑的 %%%
#include<cstdio> #include<cstring> #include<algorithm> int f[50000+19]; int a[5000+7]; int main() { int c,n; scanf("%d %d",&c,&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); f[0]=1; for(int i=1;i<=n;i++) for(int j=a[i];j<=c;j++) f[j]=std::max(f[j],f[j-a[i]]); for(int j=c;j>=0;j--) if(f[j]) { printf("%d\n",j); return 0; } return 0; }
9、1621: [Usaco2008 Open]Roads Around The Farm分岔路口
没事又写了一题
水。。
模拟,类似bfs
#include<cstdio> #include<cstring> const int len=1e6+5; int qu[len+5]; int main() { int n,k; scanf("%d %d",&n,&k); qu[1]=n; int head=1,tail=2; long long ans=0; while(head!=tail) { int rr=qu[head++];if(head==len) head=0; if(rr-k>0&&(rr-k)%2==0) { int tt=(rr-k)/2; qu[tail++]=tt; if(tail==len) tail=0; qu[tail++]=tt+k; if(tail==len) tail=0; } else ans++; } printf("%lld\n",ans); return 0; }2017 9 11:
10、1614: [Usaco2007 Jan]Telephone Lines架设电话线
随意一写竟然遇到一道难题QAQ
2017 10 14:
时光飞逝QAQ,已经过了一个月了
今天刚考完noip初赛QAQ,忐忑。。。
11、bzoj 1635: [Usaco2007 Jan]Tallest Cow 最高的牛
首先我们发现区间不可能相交(最多端点重叠或者区间包含)
那么我们可以刚开始就可以贪心地将所以牛都设为maxh
对于a can see b
我们只需将区间[ a+1,b-1 ] -1就可以了
注意去掉重复的关系
#include<cstdio> #include<cstring> int read() { int ans=0,f=1;char t=getchar(); while(t<'0'||t>'9') f=(t=='-'?-1:1),t=getchar(); while(t>='0'&&t<='9') ans=ans*10+t-'0',t=getchar(); return ans*f; } const int N=1e4+7; int ans[N]; struct node { int l,r; }e[N]; bool cmp(node a,node b) { if(a.l==b.l) return a.r<b.r; return a.l<b.l; } #include<algorithm> using std::sort; inline void swap(int &a,int &b) { int tmp=a;a=b,b=tmp; } int main() { int n=read(),k=read(),h=read(),m=read(); ans[1]=h; for(int i=1;i<=m;i++) { e[i].l=read(),e[i].r=read(); if(e[i].l>e[i].r) swap(e[i].l,e[i].r); } std::sort(e+1,e+1+m,cmp); for(int i=1;i<=m;i++) { if(e[i].l==e[i-1].l&&e[i].r==e[i-1].r) continue; ans[e[i].l+1]--;ans[e[i].r]++; } for(int i=1;i<=n;i++) ans[i]+=ans[i-1],printf("%d\n",ans[i]); return 0; }2017 10 23:
12、bzoj1610: [Usaco2008 Feb]Line连线游戏
#include<cstdio> #include<cstring> #include<algorithm> const int N=205; struct edgt { int x,y; }e[N]; struct node { double xie; }a[N*N]; const double eps=1e-10; inline bool cmp(node a,node b) { if(a.xie-b.xie<eps) return 1; return 0; } int qu[N]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d %d",&e[i].x,&e[i].y); int sum=0,cnt=0; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) if(e[i].x!=e[j].x) a[++cnt].xie=(e[i].y-e[j].y)*1.0/(e[i].x-e[j].x); else sum=1; std::sort(a+1,a+1+cnt,cmp); for(int i=2;i<=cnt;i++) if(a[i].xie!=a[i-1].xie) sum++; printf("%d\n",sum+1); return 0; }
