學姐學長們的測試
2018-5-26 學長學姐們決定給我們來一次測試。(milky-way,zzzyc,xMinh)
這次考試總結一下就是把能想到的錯誤全犯了一遍。。。
T1:最小子段和
給定n個數,選出連續且非空的一段,使得子段和最小。內存:3MB
做這道題的時候不知道怎麽想的,以為3MB只能開4個int,於是就爆了int,發現的時候已經交上去不能改了。只得了40,白丟了60分。。。
這道題我的做法很奇怪,是把所有數都取反後做最大子段和,最後輸出時再取反。
# include <cstdio> # include <iostream> using namespace std; longAlong n,x,dp,ans=0; int main() { scanf("%lld",&n); scanf("%lld",&x); x=-x; ans=x; if(x>0) dp=x; else dp=0; for (int i=2;i<=n;i++) { scanf("%lld",&x); x=-x; if(dp>=0) dp+=x; else dp=x; ans=max(ans,dp); } printf("%lld",-ans); return 0; }
T2:
在n*m的矩陣中選出2個數,要求a在b的右方或上方或右上方,b-a最大。內存:4MB
這題錯的也是很蹊蹺,雖然做法沒錯,然而我算的是a-b。。。理論得分:100;實際得分:20;
# include <cstdio> # include <iostream> # include <cstring> using namespace std; const int inf=-1000000001; int m,n,x,col,ans=inf; int Max[1001]; int main() {Bfor (int i=1;i<=1000;i++) Max[i]=inf; scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) { col=inf; for (int j=1;j<=m;j++) { scanf("%d",&x); col=max(col,Max[j]); Max[j]=max(Max[j],x); ans=max(ans,col-x); col=max(col,x); } } printf("%d",ans); return 0; }
T3:奇奇怪怪的數論
這道題的題意並不難理解,就是求x的質數因子是否也都是y的質數因子。
一開始以為gcd(x,y)=x就可以,但是9 12這組數據就會錯,所以想到把x分解一下,每個質因子只乘一次,於是就有了這段非常慢非常慢的代碼,後來發現如果x是個很大的質數會非常的慢。實際得分:10;
# include <cstdio> # include <iostream> using namespace std; int T; long long x,y,xx; long long gcd(long long a,long long b) { return b?gcd(b,a%b):a; } int main() { scanf("%d",&T); for (int i=1;i<=T;i++) { scanf("%lld%lld",&x,&y); xx=1; for (int j=2;x>1;++j) { if(x%j==0) xx*=j; while(x%j==0) x/=j; } if(gcd(xx,y)==xx) printf("YES\n"); else printf("NO\n"); } return 0; }C
T4:
本題花的時間最多,也是錯的最慘的。
手畫一下樣例感覺像是求最長下降子序列的長度,事實上也是,因為數據範圍比較大,必須寫二分的NlogN做法,然而這個做法我非常不熟練,從開始想加上寫寫調調,拍了1300多組都沒出錯,差不多用了一個多小時,交上去後發了一張密碼條“YES or Yes”。emmmm啊,Yes和No打成大寫了。。。。改了這個就A了,然而現在是0分。
# include <cstdio> # include <iostream> # include <cstring> using namespace std; const int maxn=100001; int mid,l,r,j,T,n,k,ans,len; long long a[maxn],d[maxn]; int Find(int x) { l=0; r=len; while (l<r) { mid=(l+r)>>1; if(d[mid]>x) l=mid+1; else r=mid; } return l; } int main() { scanf("%d",&T); while (T) { scanf("%d%d",&n,&k); for (int i=1;i<=n;i++) scanf("%lld",&a[i]); memset(d,-1000000001,sizeof(d)); len=1; for (int i=1;i<=n;i++) { if(a[i]<d[len]) d[++len]=a[i]; else { j=Find(a[i]); d[j]=a[i]; } } if(len>=k) printf("No\n"); else printf("Yes\n"); T--; } return 0; }D
T5:
這道題要用到spj,然而spj聽說並沒有寫出來,所以這道題就沒做。
T6:找眾數
出現次數超過一半的眾數,卡內存;
如果兩個數不一樣,都刪掉就好啦,剩下的就是那個眾數,得了70,不知道為啥。。。賽後到luogu交了一次A了。
# include <cstdio> # include <iostream> using namespace std; int use,n; long long x,ans=0; int main() { scanf("%d",&n); while (n) { scanf("%d",&x); if(ans==0) ans=x; if(x==ans) use++; if(x!=ans) { use--; if(use==0) ans=0; } n--; } printf("%d",ans); return 0; }F
一些想法:這次考試太粗心了,也可能是燒糊塗了,想得到的想不到的錯誤全犯了一遍,各種錯誤失的分加起來比實際得的分都多。以後一定要註意不能犯這種錯誤啊。。。
學姐學長們的測試