解題報告 NYIST大一新生賽(10 16)

2021-07-23 18:05:41 字數 3341 閱讀 5542

從1(簽到)到5(防ak)標下難度

難度1,2的都應該會做,難度為3的多寫一道出來就說明學得不錯

a - 分拆素數和(難度 3)

首先篩法打出一萬以內的素數(學篩法可以戳這裡)

對於給定的n,要求出兩個不同素數相加等於n的組合數量,直接列舉2到n/2的所有數,如果這個數i是素數,再判斷n-i是不是素數,如果是的話,那就找到了乙個組合。為了防止出現重複的組合,只能列舉2~n/2而不是2~n

#include

#include

#include

#define maxn 10005

//素數篩法

int is_prime[maxn];//是素數的標記為0

void prime()//篩法打表}}

}int main()

return

0;}

b - 求平均成績(難度 3)

開乙個浮點型矩陣,橫行儲存乙個學生的各科成績,縱列儲存乙個學科的各學生成績。

每橫行末尾儲存該學生的各科平均成績,沒縱列末尾儲存該科目各學生平均分。

坑點:兩個數之間有空格,末尾沒有空格,一組資料全部輸出後再輸出空行

#include

#include

#include

#include

#include

using

namespace

std;

int main()

num[i][m+1]=num[i][m+1]/(m*1.0);//行尾記錄某一學生各科平均分

}for(int j=1; j<=m; j++)

num[n+1][j]=num[n+1][j]/(n*1.0);//列尾記錄某一課程所有學生的平均分

}int result=0;//記錄所有科目均超過該科目所有學生平均分的學生數量

for(int i=1; i<=n; i++)

}if(flag==0)

result++;

}for(int i=1; i//注意空格輸出

printf("%.2lf ",num[i][m+1]);

printf("%.2lf\n",num[n][m+1]);

for(int j=1; jprintf("%.2lf ",num[n+1][j]);

printf("%.2lf\n",num[n+1][m]);

printf("%d\n\n",result);

}}

c - 手機短號(難度 1)

實力簽到題,花式做法很多

#include

#include

#include

int main()

return

0;}

d - 找單詞(難度 5)

防ak難題,做不出不要急,以後學了動態規劃或者組合數學就可以做了

先給出動態規劃的解法(動態規劃不會?下個月再學都不遲)

dp[i][j]代表前i個字母組合出j價值的方法數量是dp[i][j]

狀態轉移方程:dp[i][j]=dp[i-1][j],dp[i][j]+=dp[i-1][j-i*k];

還可以用組合數學中構造母函式的方法,這裡先不講,等學過組合數學自然就會了。

#include

#include

#include

int main ()

int ans=0;

for (int i=1; i<=50; i++)

ans+=dp[26][i];

printf("%d\n",ans);

}return

0;}

e - 夾角有多大(題目已修改,注意讀題)(難度 3)

秒針會影響分針,分針會影響時針,時針注意轉化為十二小時制

#include

#include

int main()

return

0;}

f - 查詢最大元素(難度 2)

接收完資料後,遍歷一遍字串找到最大字元並記錄,再遍歷輸出時檢測輸出的當前字元是否為最大字元,如果是最大字元就再多輸出(max)

#include

#include

#include

int main()

printf("\n");

}return

0;}

#include

#include

#include

//同餘定理

//(a%c+b%c)%c==(a+b)%c

int main()

return

0;}

h - 夾角有多大ii(難度 2)

純計算幾何,不會做的問高中數學課代表

下面的**僅供參考

#include 

#include

#define pi 3.1415926

int main()

return

0;}

i - 整數解(難度 2)

對於x+y=n,x*y=m,可以消元帶入化簡為一元二次方程,然後利用求根公式判斷得到的結果是否合法。

懶省勁的我直接暴力列舉,什麼求根公式,好麻煩。

#include 

#include

//還可套公式

int main()

}flag==true?printf("yes\n"):printf("no\n");//這是三目運算子

}return

0;}

j - 漢諾塔iii(難度 4)

輕度防ak的簡單動規,其實自己也可以遞迴推出來的。

對於只有1個圓盤,很明顯需要移動3次

對於只有2個圓盤,很明顯需要移動3*1+2次

對於只有3個圓盤,很明顯需要移動3*(3*1+2)+2次

如果用dp[i]代表有i個圓盤時需要移動的次數為dp[i]

對於只有n個圓盤,需要dp[n-1]*3+2次

狀態轉移方程:dp[1]=3,dp[n]=dp[n-1]*3+2

#include

#include

#include

#define maxn 10005

//簡單動規

//狀態轉移方程:dp[1]=2,dp[n]=dp[n-1]*3+2

int main()

return

0;}

NYIST 2017大一新生第二次周賽題解

題目鏈結 for迴圈遍歷 找到數字個數 include includechar str 10000000 int main printf d n sum return 0 b 親和數 include include includeint main sum1 n for int i 1 i sqrt ...

NYIST 2017大一新生第四次周賽題解

密碼 nyistacmtc 貪心問題,對結束時間從小到大排序,先以第乙個結束時間右端點,然後遍歷後面的,如果有開始時間比端大於或等於的,那就更新一下端點 include include include using namespace std struct stu a 110 bool cmp stu...

大一新生該學的

看到老師讓給新入學學弟們點經驗。1.別為了適用而學習。因為你暫時還不知道你以後的職業,還不能規劃自己的職業道路。所以一定要面廣,也不要太鑽研,已理解和了解為主。2.鍛鍊自己的能力,提高個人素質。這是你終身適用的。在以後的道理中,你更主要的是跟人在打交道。3.經歷大學該經歷的。去看看10個或100大學...