cf gym 101124

分享了一次新队友间的初次训练经历,包括debug过程中的困惑,数学问题的解决策略,以及运用编程解决实际问题的步骤。涉及到了余弦定理、角度计算和有环图算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

和新队友的第一次训练

体验良好

debug到头秃

好困啊靠


A.The Baguette Master 

给一个四边形相框的宽度和边框内侧四条边+对角线AD的程度,求外侧周长

如图,对四个点做垂线(因为懒所以只挑了两个角来做),将总长度分为a+b+c+d+八个小三角形的底边,同一个角上的两个小三角形的高和斜边相同,所以全等,所以角平分。因为平行关系,所以内框和外框的角相等。即小三角形的底边长=h/(tan(内角大小/2))

内角大小根据余弦定理后求反余弦函数得到,分成两部分的内角的大小可以调用两次余弦定理后反函数的和求得。

#include<bits/stdc++.h>
using namespace std;
double get1(double a,double b,double c)
{
	return acos((b*b+c*c-a*a)/(b*c*2));
 } 
double get2(double a,double w)
{
	return w*2/tan(a/2);
 } 
int main()
{
	double w,a,b,c,d,e;
	cin>>w>>a>>b>>c>>d>>e;
	printf("%.3lf\n",a+b+c+d+get2(get1(b,a,e)+get1(c,d,e),w)+get2(get1(a,b,e)+get1(d,c,e),w)+get2(get1(e,a,b),w)+get2(get1(e,c,d),w));
	
 } 

H.Kids' Play

每张桌上有一上一下两张牌,每次移动都去找与当前桌子朝下的牌数字相同的朝上的牌,已知初始位置,求某个瞬间的位置

预处理每一个环(o(n)),在预处理每个初始位置在环中的id(o(n))

查询的时候用(id+time)%长度,然后在环中找到这个id对应的位置

#include <iostream>
#include <iomanip>
#include <cstring>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int N = 100010;

pii desk[N];
bool vis[N];
vector<int> g[N];//环
int h[N];
int gcnt;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n, k;
    cin >> n >> k;
    unordered_map<int, int> mp;
    for(int i = 1; i <= n; i++)
    {
        int up, down;
        cin >> up >> down;
        desk[i] = {up, down};
        mp.insert({up, i});
    }
    unordered_map<int, int> dtog;   // 用桌号得有环图编号(圈)
    for(int i = 1; i <= n; i++)
    {
        if(!vis[i]) // 开始构建有环图
        {
            vis[i] = true;
            g[++gcnt].push_back(i);
            dtog[i] = gcnt;
            int start = desk[i].first, curDown = desk[i].second;
            do{
                int nextDesk = -1;
                if(mp.find(curDown) != mp.end()) nextDesk = mp[curDown];
                if(nextDesk != -1 && nextDesk != i)
                {
                    g[gcnt].push_back(nextDesk);
                    dtog[nextDesk] = gcnt;
                    curDown = desk[nextDesk].second;
                    vis[nextDesk] = true;
                }
                else break;
            }while(1);
        }
    }
    for(int i=1;i<=gcnt;i++)
    {
        for(int j=0;j<g[i].size();j++)
        {
            int y=g[i][j];
            h[y]=j;
            //cout<<y<<" ";
        }
        //cout<<endl;
        
    }
    while(k--)
    {
        ll dn, time;
        cin >> dn >> time;
        int gn = dtog[dn];
        int startPos = 0;
        startPos = h[dn];
        time += (ll)startPos;
        time %= g[gn].size();
        //y=
        //cout <<startPos<<" "<< g[gn].size()<<" time = " << time << " ans = " << g[gn][time] << endl;
        cout << g[gn][time] <<endl;
    }
    //system("pause");
}


M.A multiplication game

两个b,轮流操作n(n初始值为1),每次可以在n上乘2-9,问谁赢

找规律,以18的次方分割

#include <iostream>
#include <iomanip>
#include <cstring>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <algorithm>

using namespace std;

int main()
{
	double n;
    while(cin >> n)
    {
        while(n>18)
        {
        	n=n/18; 
		}
		if(n<=9)
		{
			cout<<"Stan wins.\n";
		}
		else
		{
			cout<<"Ollie wins.\n";
		}
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值