【计划执行报告】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;
}