cf gym 101124

Posted yeah17981

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cf gym 101124相关的知识,希望对你有一定的参考价值。

和新队友的第一次训练

体验良好

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;
}

以上是关于cf gym 101124的主要内容,如果未能解决你的问题,请参考以下文章

CF Gym Dice Game BFS 暴搜

cf gym 100960 G. Youngling Tournament set+树状数组

CF Gym-101911A Coffee Break

CF Gym 102059E Electronic Circuit (set存图删点)

CF gym102759IQuery On A Tree 17

CF GYM 100548 Last Defence