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