考试总结 2018-5-22
第一次正规的多校训练赛,由于多种原因考的非常差,30分。
第一题是一道数论题,应该属于很简单的那种,打几个if就行。然后就写了一个暴力版本找规律:
以对角线为界,下面的都是1赢,下面的都是2赢。而对角线上的情况则是a%2==1是a赢,a%2==0时b赢。
而我考试结束的时候的版本没有删掉freopen,对于样例是对的(不知道为啥就对了),而评测的时候会爆零,因为不需要用(说好的OI赛制)。并且删了freopen之后还是不能AC,因为我用的是cin,读入会炸(万恶的出题人卡快读) 。把这俩问题都改了就能AC了。
using namespace std; int n,a,b; int read() { int x=0;char ch=getchar(); while(ch>'9'||ch<'0') ch=getchar(); while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return x; } int main() { n=read(); while(n!=0) { n=n-1; a=read();b=read(); if(a>b) { printf("AWaDa!"); printf("\n"); continue; } if(a<b) { printf("AKTang!"); printf("\n"); continue; } if(a%2==1) { printf("AWaDa!"); printf("\n"); } else { cout<<"AKTang!"<<endl; printf("\n"); } } return 0; }
本题得了0分。
第二题是一道贪心的题目,放置最少的点使得每个区间上都存在点。那么按照右端点为第一关键字排序,每次都放在当前不能炸掉的桥的右端点,一定是最优解。然后再把能炸掉的都炸掉(放过去),再做一次决策。
考虑到第一题,这道题也加入了快读。
using namespace std; int n,t,i,now,ans; int read() { int x=0;char ch=getchar(); while(ch>'9'||ch<'0') ch=getchar(); while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return x; } struct ppp { int a,b; }o[100010]; bool mycmp(ppp x,ppp y) { if(x.b==y.b)return x.a<y.a; return x.b<y.b; } int main() { ios::sync_with_stdio(false); n=read(); for(i=1;i<=n;i++) { o[i].a=read(); o[i].b=read(); t=read(); } sort(o+1,o+1+n,mycmp); for(now=1;now<=n;) { ans++; t=o[now].b; while(o[now].a<=t&&now<=n) { now++; } } cout<<ans; return 0; }
用了我在考试的时候还没有改数组大小,导致只拿了30分。
第三题是一个最短路的问题,还算是裸吧(连我都会),对于两个星球做一次最短路,然后判断两个端点用哪个更近。然后就开始写dijkstra,调试的快吐了(当时就发誓考完后一定好好学图论)。
#include<iostream> #include<algorithm> #include<string> #include<cstring> #include<cstdio> #include<cmath> #include<iomanip> using namespace std; int n,m,sum,a[10010][10010],dis[10010]; int read() { int x=0;char ch=getchar(); while(ch>'9'||ch<'0') ch=getchar(); while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return x; } struct ppp { int u,v,w; int ans[5]; }x[10010],y[10010]; bool vis[10010]; void d(int st) { for(int i=1;i<=n+3;i++) dis[i]=a[i][st]; memset(vis,0,sizeof(vis)); vis[st]=1;dis[st]=0; for(int i=1;i<n+3;i++) { int minn=100000000; int k=0; for(int j=1;j<=n+3;j++) if((!vis[j])&&dis[j]<minn) { minn=dis[j]; k=j; } if(k==0)return; vis[k]=1; for(int j=1;j<=n+3;j++) if((!vis[j])&&(dis[k]+a[k][j]<dis[j])) dis[j]=dis[k]+a[k][j]; } } int main() { n=read(); m=read(); sum=read(); for(int i=0;i<=n+5;i++) for(int f=0;f<=n+5;f++) a[i][f]=a[f][i]=100010; for(int i=1;i<=m;i++) { x[i].u=read(); x[i].v=read(); x[i].w=read(); a[x[i].u][x[i].v]=a[x[i].v][x[i].u]=min(a[x[i].v][x[i].u],x[i].w); } for(int i=1;i<=sum;i++) { y[i].u=read(); y[i].v=read(); y[i].w=read(); a[y[i].u][y[i].v]=a[y[i].v][y[i].u]=min(a[y[i].v][y[i].u],y[i].w); } //////////////////////////////////////////// d(n+1); for(int i=1;i<=m;i++) { x[i].ans[1]=dis[x[i].u]; x[i].ans[3]=dis[x[i].v]; } ////////////////////////////////// d(n+2); for(int i=1;i<=m;i++) { x[i].ans[4]=dis[x[i].u]; x[i].ans[2]=dis[x[i].v]; x[i].ans[0]=min(x[i].ans[1]+x[i].ans[2],x[i].ans[3]+x[i].ans[4])+x[i].w; if(x[i].ans[0]>100010) { printf("GG"); } else printf("%d",x[i].ans[0]); printf("\n"); } }
考试的时候还没有把自己的代码放上去,只放了个样例,就很气了。
第四题还没写完就结束了。。。。
本次考试非常爆炸,如果让我把代码换一下的话大概可以拿到200多一点。以后我一定要每道题都写快读,不用freopen,好好学图论,争取下次考试拿到高分。