【計劃執行報告】Day26 校內模擬賽初體驗

今天:

  1. 計劃執行的第26天。
  2. 首次參加學校ACM俱樂部組織的校內模擬賽
  3. 重啓Unity3d,學習了FPS遊戲的基本原理

1. 近期事件線

考慮了近兩週的主要事件(新能源熱利用還有一次作業,暫未佈置)。
在這裏插入圖片描述

2.今日計劃執行情況

04-25 任務完成情況

04-25

3.明日計劃

明天的主要任務就是準備熱電材料的答辯報告了,加油~
04-26

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根(奇數根)羽毛,其實看到數據範圍10910^9就得果斷放棄常規思維,找到問題的本質

#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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章