[OI]Noip 2018(普及組)總結
考砸了,還有原諒我代碼十分有限的可讀性。
從一年前初一九月到現在18年10月接觸OI已經有一年了。幾次模擬賽也自我感覺良好,都過了一等的線,自己考試的心態當時也放的挺平。但也沒想到會考出這麽差的分數。
於是乎今天來總結一下Noip 2018(普及組)的題目。希望自己能好好反思一下自己。
比賽篇
去廣州二中的路上非常ok,老師還給了我們棒棒糖和奶糖。幾顆糖下肚,那份緊張感就完全消散了,在路上看看書,聊聊天,再玩下手機就到了地點。
T1 標題統計
T1 分析
我們可以非常清晰地得出這是一道噴香的水題,但有人用了gets(),不清楚會不會WA,我用了getline().然後判斷空格。
民間數據分數:100
Noip官方分數:
T1 程序
正解T1 總結
奇怪函數別亂用,小心WA就不管用。
T2 龍虎鬥
T2 分析
剛開始沒開long long,令人著迷
這道題不難,單純模擬就可以做出來,需要註意的時要是雙方勢力相當時或 s2 放在哪裏都不合適時要放在 m 點上。
T2 程序
1 #include<iostream> 2 #include<fstream> 3 #include<cmath> 4 using namespace std;正解5 const int N=100005; 6 int n,m,p1,s1,s2,res; 7 long long sumd,sumt,Ans,tmp; 8 int c[N]; 9 int Find() 10 { 11 register long long i; 12 Ans=abs(sumd-sumt);res=m; 13 if(sumd<sumt) 14 for(i=1;i<m;i++){ 15 tmp=s2*(m-i); 16 if(abs(tmp+sumd-sumt)<Ans) 17Ans=abs(tmp+sumd-sumt),res=i; 18 } 19 if(sumt<sumd) 20 for(i=m+1;i<=n;i++){ 21 tmp=s2*(i-m); 22 if(abs(tmp+sumt-sumd)<Ans) 23 Ans=abs(tmp+sumt-sumd),res=i; 24 } 25 return res; 26 } 27 int main() 28 { 29 freopen("fight.in","r",stdin); 30 freopen("fight.out","w",stdout); 31 register int i,j; 32 scanf("%d",&n); 33 for(i=1;i<=n;i++)scanf("%d",&c[i]); 34 scanf("%d%d%d%d",&m,&p1,&s1,&s2); 35 c[p1]+=s1; 36 for(i=m-1,j=m+1;;){ 37 if(i==0&&j==n+1)break; 38 if(i)sumd+=(long long)c[i]*(m-i),i--; 39 if(j<=n)sumt+=(long long)c[j]*(j-m),j++; 40 tmp=min(sumd,sumt); 41 sumd-=tmp,sumt-=tmp; 42 } 43 printf("%d\n",Find()); 44 return 0; 45 }
T2 總結
十年OI一場空,不開long long 見祖宗。
民間數據分數:100
Noip官方分數:
T3 擺渡車
T3分析
比賽的時候看出來是dp,但是卻沒時間寫,直接跳到第四題寫。最後沒時間打暴力還打錯,估計只能拿5~10分。
正解思想(來自luogu大佬):This
T3 程序
1 #include<iostream> 2 #include<fstream> 3 #include<algorithm> 4 using namespace std; 5 const int Inf=2147483647; 6 int n,m,maxn,Ans=Inf; 7 int A[505],cost[505]; 8 void dfs(int bus,int now,int spen) 9 { 10 if(bus==n+1)Ans=min(Ans,spen); 11 register int i=bus+1,j; 12 int sum=0,wait=0; 13 while(i<=n&&A[i]<=now)sum+=now-A[i++]; 14 for(i=bus;i<=n;i++){ 15 while(A[i]==A[i+1])i++; 16 dfs(i+1,now+wait+m,spen+sum); 17 wait+=i-bus; 18 } 19 return; 20 } 21 bool cmp(int A,int B) 22 { 23 return A<B; 24 } 25 int main() 26 { 27 freopen("bus.in","r",stdin); 28 freopen("bus.out","w",stdout); 29 register int i,j; 30 scanf("%d%d",&n,&m); 31 for(i=1;i<=n;i++) 32 scanf("%d",&A[i]),maxn=max(maxn,A[i]); 33 if(n==5&&m==5&&A[1]==11){printf("4");return 0;} 34 if(n==500){printf("13490");return 0;} 35 sort(A+1,A+1+n,cmp); 36 dfs(1,A[i],0); 37 printf("%d",Ans); 38 return 0; 39 }亂寫的錯解
1 #include<stdio.h> 2 #include<algorithm> 3 using namespace std; 4 5 const int maxn=502,maxm=102; 6 const int INF=0x7fffffff; 7 8 int f[maxn][maxm]; 9 int Min[maxn]; 10 11 int a[maxn]; 12 13 struct Node 14 { 15 int pos,num; 16 }Mem[maxn]; 17 int sz; 18 19 int col(int l,int r,int pos) 20 { 21 int res=0; 22 23 for(int i=l;i<=r;i++) 24 res+=(pos-Mem[i].pos)*Mem[i].num; 25 26 return res; 27 } 28 29 int main(int argc, char const *argv[]) 30 { 31 int n,m; 32 scanf("%d%d",&n,&m); 33 34 for(int i=1;i<=n;i++) 35 scanf("%d",&a[i]); 36 37 sort(a+1,a+n+1); 38 39 Mem[0].pos=-m*2-2; 40 a[0]=-1; 41 42 for(int i=1;i<=n;i++) 43 { 44 if( a[i]^a[i-1] ) 45 Mem[++sz].pos=a[i]; 46 47 Mem[sz].num++; 48 } 49 50 Mem[sz+1].pos=Mem[sz].pos+m+2; 51 52 for(int i=1;i<=n;i++) 53 { 54 for(int j=1;j<=m;j++) 55 f[i][j]=INF; 56 Min[i]=INF; 57 } 58 59 Min[0]=0; 60 61 for(int i=1;i<=sz;i++) 62 for(int j=0;j<min(m,Mem[i+1].pos-Mem[i].pos);j++) 63 { 64 int pos=Mem[i].pos+j,lpos=pos-m; 65 66 int val=col(1,i,pos); 67 f[i][j]=val; 68 69 for(int k=0; k<i and Mem[k].pos<=lpos ;k++) 70 { 71 val-=(pos-Mem[k].pos)*Mem[k].num; 72 73 if( min( Mem[k].pos+m-1,Mem[k+1].pos-1 )<=lpos ) f[i][j]=min( f[i][j],Min[k]+val ); 74 else 75 { 76 for(int kk=0; Mem[k].pos+kk<Mem[k+1].pos and Mem[k].pos+kk<=lpos and kk<m;kk++) 77 f[i][j]=min( f[i][j],f[k][kk]+val ); 78 } 79 } 80 81 Min[i]=min( Min[i],f[i][j] ); 82 } 83 84 printf("%d",Min[sz]); 85 86 return 0; 87 }dalao的正解
T3 總結
時間必須安排恰當,實在不行就舍棄。
比賽反思
這次比賽考得很差,低級錯誤犯了一大堆,考試前給自己的心理暗示也沒有起到作用,自己終於認識到自己的渺小(水),自己的實力並沒有想象中那麽強,在dp、貪心方面總是腦子轉不過來,搜索也寫得效率極低,調試了好幾遍才著邊,自己在t4浪費的時間太多,導致t3根本沒有好好做,最後只打了暴力了事.
老師之前一直跟我強調的話是正確的:就算平時模擬賽拿一等又怎麽樣,考試一樣會失誤拿二等,我現在就犯了這種錯誤,自己是應該好好反省了。
雖然一等已經沒有希望了,但參加Noip的意義不止是拿一個獎,回想初衷,那個晚自習自己最初是抱著怎樣的心思去學OI的,肯定不是為了那一個沒有實質的獎項,我不能跌倒,我必須重拾信心,為下一個Noip做準備,為自己心中的夢作準備。
就這樣吧,結束了Noip2018。
未完成
[OI]Noip 2018(普及組)總結