10.24 25模拟

2019-04-13 21:01发布

用NOIP2014模拟了一发,自己水爆了= =,发现必须要写!暴!力!。
day1T1签到题,模拟一发走人。 #include #include #include #include using namespace std; int cur,cura,curb,a[300],b[300],pointa,p,pointb,n,na,nb; int main() { cin>>n>>na>>nb; for (int i=1;i<=na;i++) cin>>a[i]; for (int i=1;i<=nb;i++) cin>>b[i]; cura=0;curb=0; for (int i=1;i<=n;i++) { cur++; cura++; curb++; if (a[cura]==b[curb]) p=1; else if ( ( a[cura]==0 && ( b[curb]==1 || b[curb]==4 ) ) || ( a[cura]==1 && ( b[curb]==2 || b[curb]==4 ) ) || ( a[cura]==2 && ( b[curb]==3 || b[curb]==0 ) ) || ( a[cura]==3 && ( b[curb]==0 || b[curb]==1 ) ) || ( a[cura]==4 && ( b[curb]==2 || b[curb]==3 ) ) ) pointb++;else pointa++; if (cura==na)cura=0; if (curb==nb)curb=0; } cout << pointa<<' '<return 0; } T2写树归WA了QAQ,数据不好造就没对拍= =,然后果断WA,写暴力应该都有70分
70分做法:
写个暴力枚举每个点,然后枚举每条边两两相乘然后乘2;
100分做法:
树归啊,因为是a*b+a*c+a*d+。。。。+c*d,把它以转换变成Σa*(sum-a),记录一个sum,然后在输入的时候判断判断最大的两个点就好了。
怪我智障 #include #include #include #include using namespace std; const int maxn = 200010,mod = 10007; int n,w[maxn],tot,head[maxn],nextt[maxn * 2],to[maxn * 2],sum,max1,max2,ans1,ans2; void add(int a, int b) { to[++tot] = b; nextt[tot] = head[a]; head[a] = tot; } int main() { scanf("%d", &n); for (int i = 1; i <= n - 1; i++) { int u, v; scanf("%d%d", &u, &v); add(u, v); add(v, u); } for (int i = 1; i <= n; i++) scanf("%d", &w[i]); for (int i = 1; i <= n; i++) { max1 = max2 = -1; sum = 0; for (int j = head[i]; j; j = nextt[j]) { int temp = w[to[j]]; sum += temp; sum %= mod; if (temp > max1) { max2 = max1; max1 = temp; } else if (temp > max2) max2 = temp; } ans2 = max(ans2, max1 * max2); for (int j = head[i];j;j = nextt[j]) { ans1 += (w[to[j]] * (sum - w[to[j]])) % mod; ans1 %= mod; } } ans1 = (ans1 + mod) % mod; printf("%d %d ", ans2, ans1); return 0; } t3的坑以后再填 day2t1也是签到题,枚举直接过关,但是就得了70分QAQ,手贱的从d处开始搜索,应该搜索整个大范围。 #include #include #include #include #include using namespace std; int pic[150][150],x,y,k,ans,wifi[30000]; int cmp(const int &a,const int &b){return a>b;} int main() { //freopen("std.in","r",stdin); //freopen("std.out","w",stdout); memset(wifi,0,sizeof(wifi)); memset(pic,0,sizeof(pic)); ans=0; int d,n,t=0,b; cin>>d>>n; b=128-d; for (int i=1;i<=n;i++) { cin>>x>>y>>k; pic[x][y]=k; } for (int i=0;i<=128;i++) for (int j=0;j<=128;j++) { t++; for (int k2=-d;k2<=d;k2++) { for (int k1=-d;k1<=d;k1++) if (k1+j>=0&&k2+i>=0) wifi[t]+=pic[i+k2][j+k1]; } //if (wifi[t]==10)cout< } sort(wifi+1,wifi+t+1,cmp); for (int i=1;i<=t;i++) { ans++; if (wifi[i]!=wifi[i+1])break; } cout<' '<1]; } t2也是水题= =
正反bfs一遍,注意的是第一次bfs的元素用pair更加的方便。
还有就是对于连向不能到达的点的处理,需要另外设置一个数组来处理。 #include #include #include #include #include using namespace std; typedef pair<int,int>pii; queue<int>q1; queueq2; struct edge{ int v,next; }e[200010],inv[200010]; int start,final,vis1[10010],t=0,p1,p2,cant[10010],heada[200010],headb[200010],k,vis[10010],dfn,n,m; int main() { cin>>n>>m; memset(heada,0,sizeof (heada)); memset(headb,0,sizeof (headb)); memset(cant,0,sizeof(cant)); for (int i=1;i<=m;i++) { scanf("%d%d",&p1,&p2); t++; e[t].v=p2; e[t].next=heada[p1]; heada[p1]=t; inv[t].v=p1; inv[t].next=headb[p2]; headb[p2]=t; } cin>>start>>final; q1.push(final); while(!q1.empty()) { k=q1.front(); q1.pop(); for (int i=headb[k];i;i=inv[i].next) if(!vis[inv[i].v]) { vis[inv[i].v]=1; q1.push(inv[i].v); } } vis[final]=1; for (int i=1;i<=n;i++) if (!vis[i]) { for (int j=headb[i];j;j=inv[j].next) cant[inv[j].v]=1; } for (int i=1;i<=n;i++) if (cant[i])vis[i]=0; if (!vis[start]){cout<<-1;return 0;} q2.push(make_pair(start,0)); vis1[start]=1; while(!q2.empty()) { pii x=q2.front(); q2.pop(); int x1=x.first; for (int i=heada[x1];i;i=e[i].next) { if (e[i].v==final) { cout<1; return 0; } if (vis[e[i].v]&&!vis1[e[i].v]) { q2.push(make_pair(e[i].v,x.second+1)); vis1[e[i].v]=1; } } } for (int i=1;i<=n;i++) cout<return 0; } t3解方程就放过我这个数论渣渣把,留坑以后再补 感觉NOIP要爆零了

热门文章