NOIp2017冲刺倒计时19天 noip2014D2
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIp2017冲刺倒计时19天 noip2014D2相关的知识,希望对你有一定的参考价值。
上午考了2014Day2,题目都比较水,而我考的很渣渣
T1 https://www.luogu.org/problem/show?pid=2038
暴力枚就好,稍微加个前缀和优化(不加也可以过,不过不是很稳,我就加了一维(因为懒))
然而输出的时候GG,本该输出空格的,我竟傻到输出换行,,,
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define maxn 210 int mp[maxn][maxn],S[maxn][maxn],bns[maxn][maxn]; int main(){ freopen("wireless.in","r",stdin); freopen("wireless.out","w",stdout); int d,n; scanf("%d%d",&d,&n); for(int i=1;i<=n;++i){ int x,y,k; scanf("%d%d%d",&x,&y,&k); mp[++x][++y]=k; } for(int i=1;i<=129;++i){ for(int j=1;j<=129;++j){ S[i][j]=S[i][j-1]+mp[i][j]; } } int maxx=0; for(int i=1;i<=129;++i){ for(int j=1;j<=129;++j){ int tmp=0; for(int kk=max(1,i-d);kk<=min(129,i+d);++kk){ tmp+=S[kk][min(129,j+d)]-S[kk][max(1,j-d)-1]; } maxx=max(maxx,tmp); bns[i][j]=tmp; } } int ans=0; for(int i=1;i<=129;++i){ for(int j=1;j<=129;++j){ if(bns[i][j]==maxx){ ++ans; } } } printf("%d %d",ans,maxx); return 0; }
最后PE,,, 0分
T2
https://www.luogu.org/problem/show?pid=2296
又是一道水题,然而我又没拿满,,,
直接建反边,跑两边bfs
第一遍记录没有联通的点
然后删掉这些点和建完反边后通向的点
第二遍bfs其实就是spfa
问题出在删点,
我的错误代码:
for(int i=1;i<=n;++i){ if(!vis[i]){ for(int j=head[i];j;j=E[j].next){ vis[E[j].v]=0; } } }
真的是傻,,,vis会影响下一步决策呐~
幸亏数据水到让我过2个点
#include<cstdio> #include<queue> #include<cstring> #include<algorithm> using namespace std; #define maxm 2000010 #define maxn 100010 int head[maxn],ecnt=0; int dis[maxn]; int vis1[maxn],vis2[maxn],vis[maxn]; int F[maxm],T[maxm]; struct Edge{ int u,v,next; }E[maxm]; void addedge(int u,int v){ E[++ecnt].u=u; E[ecnt].v=v; E[ecnt].next=head[u]; head[u]=ecnt; } void bfs(int dove){ queue<int> q; q.push(dove); vis[dove]=1; while(!q.empty()){ int xx=q.front(); q.pop(); for(int i=head[xx];i;i=E[i].next){ int v=E[i].v; if(!vis[v]){ vis[v]=1; q.push(E[i].v); } } } } void spfa(int dove,int jug){ queue<int> q; q.push(dove); vis2[dove]=1; while(!q.empty()){ int xx=q.front(); q.pop(); for(int i=head[xx];i;i=E[i].next){ int v=E[i].v; if(vis1[v]||vis2[v]) continue; vis2[v]=1; dis[v]=dis[xx]+1; q.push(v); } } } int main(){ int n,m,s,t; scanf("%d%d",&n,&m); for(int i=1;i<=m;++i) scanf("%d%d",&F[i],&T[i]); for(int i=1;i<=m;++i) addedge(T[i],F[i]); scanf("%d%d",&s,&t); bfs(t); for(int i=1;i<=n;++i) if(!vis[i]){ vis1[i]=1; for(int j=head[i];j;j=E[j].next) vis1[E[j].v]=1; } spfa(t,s); if(dis[s]>n)dis[s]=-1; printf("%d",dis[s]); return 0; }
然后re掉一个点,把数组扩大10倍就a了
T3 https://www.luogu.org/problem/show?pid=2312
本来之前做过的,然后就凭着印象写,然后写炸,骗了50分
所以最后总共70
这是题目最水到我能AK的一次,然后机会就,,,
以上是关于NOIp2017冲刺倒计时19天 noip2014D2的主要内容,如果未能解决你的问题,请参考以下文章
qboi冲刺NOIP2017复赛试题4 全套题目+题解+程序