1. 程式人生 > >學姐學長們的測試

學姐學長們的測試

const pan 最大 連續 想法 inf cst 範圍 刪掉

2018-5-26 學長學姐們決定給我們來一次測試。(milky-way,zzzyc,xMinh)

這次考試總結一下就是把能想到的錯誤全犯了一遍。。。

T1:最小子段和

給定n個數,選出連續且非空的一段,使得子段和最小。內存:3MB

做這道題的時候不知道怎麽想的,以為3MB只能開4個int,於是就爆了int,發現的時候已經交上去不能改了。只得了40,白丟了60分。。。

這道題我的做法很奇怪,是把所有數都取反後做最大子段和,最後輸出時再取反。

技術分享圖片
# include <cstdio>
# include <iostream>

using namespace std;

long
long 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; }
A

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()
{
    
for (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; }
B

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

一些想法:這次考試太粗心了,也可能是燒糊塗了,想得到的想不到的錯誤全犯了一遍,各種錯誤失的分加起來比實際得的分都多。以後一定要註意不能犯這種錯誤啊。。。

學姐學長們的測試