【計劃執行報告】Day26 校內模擬賽初體驗
今天:
- 計劃執行的第26天。
- 首次參加學校ACM俱樂部組織的校內模擬賽
- 重啓Unity3d,學習了FPS遊戲的基本原理
1. 近期事件線
考慮了近兩週的主要事件(新能源熱利用還有一次作業,暫未佈置)。
2.今日計劃執行情況
04-25 任務完成情況
3.明日計劃
明天的主要任務就是準備熱電材料的答辯報告了,加油~
4. 校內模擬賽感想
本次比賽一共100來個人有作答的記錄,一共9題,這次總共AC了前4題,當時挺興奮的,但隨後心情複雜起來。。。
Rank
這裏我就只把我前面的大佬們曬一下了,仔細一看,在我前面好多18、19級的學弟學妹呀,tql!(丟了17級的臉了,很抱歉QAQ)
感想
-
怎麼說呢?這次比賽用的是本校自己寫的OJ,調試運行時只會告訴你大體的錯誤類型,具體錯誤描述與未通過的測試用例不會公開,而我平時訓練用的平臺多爲Leetcode,它有一個強大的調試平臺,可以很方便的自行設置測試用例,因此打比賽時有點“水土不服”,總是WA——不知道錯在哪,這也反映了一個問題:那就是我太依賴調試而不重視對問題本身的細節思考,以至於我總是不能把問題想全面,只能通過不斷試錯而找到正解。
-
我是第一次做這種用詼諧幽默的語言描述的題目,看第一眼時滿臉問號,要花點時間把題意明確,出題者真的tql,把所有題目用一個事件全部穿起來了,有種講故事的感覺;不過第一眼看到題目名稱時差一點把我勸退了。。。
-
另外,我平常訓練的題目多偏向於一些經典的數據結構與算法,但是本次比賽我做的那幾道題主要考察數學思維,關於題目具體的分析我會抽時間專門寫一篇文章,本次只列出我做出來的題目。
A. ddd和鸚鵡
這道題就是考察數學:如何判定點在三角形內
#include <iostream>
#include <cmath>
using namespace std;
struct Point {
int x;
int y;
} A, B, C;
double dist(Point A, Point B) { return sqrt((A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y)); }
double func(Point O) { return 3 * dist(A, O) + 2 * dist(B, O) + dist(C, O); }
int point_in_same_side(Point A, Point B, Point C, Point O) {
// check pc and pd in line AB same side
// line AB function , y = kx + c , k = b/a
// ay = bx + C , C = a*c
// C = ay - bx
int a = A.x - B.x;
int b = A.y - B.y;
int c1 = a * A.y - b * A.x;
int c2 = a * C.y - b * C.x;
int c3 = a * O.y - b * O.x;
if (c1 <= c2 && c1 <= c3 || c1 >= c2 && c1 >= c3) {
return 1;
}
return 0;
}
int point_in_triangle(Point O) {
int r =
point_in_same_side(A, B, C, O) && point_in_same_side(A, C, B, O) && point_in_same_side(C, B, A, O);
return r;
}
int min(int a, int b, int c) {
if (a <= b && a <= c)
return a;
else if (b <= a && b <= c)
return b;
return c;
}
int max(int a, int b, int c) {
if (a >= b && a >= c)
return a;
else if (b >= a && b >= c)
return b;
return c;
}
int main() {
cin >> A.x >> A.y >> B.x >> B.y >> C.x >> C.y;
int x_min = min(A.x, B.x, C.x), x_max = max(A.x, B.x, C.x), y_min = min(A.y, B.y, C.y),
y_max = max(A.y, B.y, C.y);
double min = 1000000000;
int mx, my;
for (int x = x_min; x <= x_max; x++) {
for (int y = y_min; y <= y_max; y++) {
Point O;
O.x = x, O.y = y;
if (point_in_triangle(O)) {
double dis = func(O);
if (dis < min) {
min = dis;
mx = x;
my = y;
}
}
}
}
cout << mx << " " << my << endl;
return 0;
}
B. ddd和鴿子
就是個鐘錶問題,關鍵在於讀取時間格式中的小時與分鐘,然後注意時針、分針夾角的加減關係即可,這道題WA了5次,所以說還是考慮得不夠全面
#include <iostream>
#include <string>
#include <sstream>
#include <cmath>
#include <iomanip>
using namespace std;
void convert(string time, int& h, int& m) {
stringstream ss;
ss << time.substr(0, 2);
ss >> h;
ss.clear();
ss << time.substr(3, 2);
ss >> m;
}
int main() {
string t;
cin >> t;
int h, m;
convert(t, h, m);
if (h < 0 || h > 23 || m < 0 || m > 59)
return 0;
float angle = 0;
int h_left, m_left;
while (h >= 12) {
h -= 12;
}
h = 12 - h >= h ? (h_left = 0, h) : (h_left = 1, 12 - h);
angle += h_left ? -0.5 * m : 0.5 * m;
angle += h * 30;
m = 60 - m >= m ? (m_left = 0, m) : (m_left = 1, 60 - m);
angle += h_left == m_left ? (-m * 6) : (m * 6);
angle = angle > 0 ? angle : -angle;
if (angle > 180) {
angle = 360 - angle;
}
cout << setiosflags(ios::fixed) << setprecision(1) << abs(angle) << endl;
return 0;
}
C. ddd和騾馬
這題就不多說了,唯一一個速過的題
#include<iostream>
using namespace std;
int a[46];
int sum(int n){
int res=0;
while(n){
res+=n%10;
n/=10;
}
return res;
}
int main(){
int n;
cin>>n;
int ret=0;
for(int i=1;i<=n;i++){
a[sum(i)]++;
}
for(int i=1;i<46;i++){
ret+=a[i]*a[i];
}
cout<<ret;
return 0;
}
D. ddd和鴕鳥
這道題我想了很久,發現只要是誰的回合羽毛總和爲奇數,誰就贏了~這主要是因爲每次減少2k-1根(奇數根)羽毛,其實看到數據範圍就得果斷放棄常規思維,找到問題的本質
#include<iostream>
using namespace std;
int a[100000];
int main(){
int n;
int ans=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
ans+=a[i]&1;
}
ans=ans%2;
if(ans)
cout<<"ddd";
else
cout<<"bqp";
return 0;
}