1. 程式人生 > >牛客集訓營第五場補題

牛客集訓營第五場補題

n) print std sync 坐標 直接 adding 做了 space

題目鏈接:

題號 標題 已通過代碼
A 炫酷雙截棍 點擊查看
B 炫酷五子棋 點擊查看
C 炫酷迷宮 點擊查看
D 炫酷路途 點擊查看
E 炫酷劃線 點擊查看
F 炫酷回文 點擊查看
G 炫酷數字 點擊查看
H 炫酷雪花 點擊查看
I 炫酷鏡子 點擊查看
J 炫酷數學 點擊查看

A:

使用double高精度,坐標系內兩點之間距離 sqrt(pow(x1-x2),pow(y1-y2))

判斷目標點和 l1+l2 的關系,大的話,結果就是 sqrt(x*x + y*y) - l1 - l2

判斷目標點和 l1-l2 的關系,小的話,結果就是 abs(l1 - l2) - sqrt(x*x + y*y)

目標點在範圍內就輸出0.00000000

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    double l1, l2,  x, y,len;
    scanf("%lf%lf%d", &l1, &l2, &t);
    getchar();
    while (t--)
    {
        cin >> x >> y;
        if (sqrt(x*x + y*y) > l1 + l2)
        {
            printf("%.8f\n",sqrt(x*x + y*y) - l1 - l2 );
        }
        else if (sqrt(x*x + y*y) < abs(l1 - l2))
        {
            printf("%.8f\n", abs(l1 - l2) - sqrt(x*x + y*y));
        }
        else printf("0.00000000\n");
    }
    return 0;
}

D:

先把2^n次方 存在a數組,然後比較2^n走法,傳送走法+2^n走法,那個小就取那個

#include <iostream>
#include<algorithm>
using namespace std;
#define ll long long
ll a[50];
ll find(ll u, ll v) {//就是2^n次方走
	ll sum = 0;
	while (u<v) {
		for (int i = 30; i >= 0; i--) {//貪心
			if (u + a[i] <= v) {
				u += a[i];
				sum++;
				break;
			}
		}
	}
	return sum;
}
int main() {
	a[0] = 1;
	for (int i = 1; i <= 30; i++) {//1024是10次方 所以1e9約等於30次方
		a[i] = a[i - 1] << 1;
	}
	ll n, k;
	cin >> n >> k;
	ll ans;
	ans = find(1, n);
	for (int i = 0; i < k; i++) {
		int u, v;
		cin >> u >> v;
		if (u>v) swap(u, v);
		if (u == v) continue;
	//	cout << ans << "    " << find(1, u) + 1 + find(v, n) << endl;
		ans = min(ans, find(1, u) + 1 + find(v, n));//min(2^n走法,傳送走法+2^n走法)
	}
	cout << ans << endl;
	return 0;
}

G:

註釋都寫在代碼裏了 直接看代碼

/*********************************************************
 
#代碼作者:一屆書生 
#題目大意: 求含有n個因子的最小正整數
#描述說明:每個數的因子肯定小於它,所以可以從1~max,
把所有的數的因子個數求出來
然後找因子個數的最小值
 
*********************************************************/
#include<iostream>
using namespace std;
int yin[1000005];//yin[i]代表的是i的因子個數  
int ans[1000005];//ans[i]代表含有i個因子個數的值
void shai()
{
	for (int i = 1; i < 1000004; i++) //i代表因子個數
	{
		for (int j = i; j < 1000004; j += i)
  //j是i倍數 不斷給1~1000000添加每個數的因子
		{
			yin[j]++;//是i的倍數的數  因子個數都加1
		}
		if (ans[yin[i]])
  //如果ans[i]不為零了,那麽說明這個數不是因子個數為i的情況下的最小值
			continue;
		else//如果這個數之前沒有被賦值 說明是最小的
			ans[yin[i]] = i;
	}
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);//輸入很多的時候 關閉流同步
	shai();
	int t, n;
	cin >> t;
	while (t--)
	{
		cin >> n;
		if (ans[n])
			cout << ans[n] << "\n";
		else
			cout << -1 << "\n";
	}
	return 0;
} 

I:

寫的比較亂,剛開始想簡單了,這算是我第一次寫dfs了,紀念一下,第一次只寫了向下,然後測試樣例發現不對,又想到了還需要判斷光線方向,就在dfs裏加一個變量h代表方向

#include<bits/stdc++.h>
using namespace std;
int n, m,flag;
char a[510][510];
void dfs(int x,int y,int k,int h)
//x,y代表坐標 ,k代表是否出界,h代表方向 
//上下左右 1234
{
    if (k==0)
    {
        return;
    }
    if ((y>m)||y == 0||x==0) {
        cout << -1 << "\n";
        k = 0;
        return;
    }
    if (x > n) {
        cout << y << "\n";
        return;
    }
    else {
         if (a[x][y] == ‘.‘&&h == 2)    //下
            dfs(x + 1, y, 1, 2);
        else if (a[x][y] == ‘/‘&&h == 2)
            dfs(x, y - 1, 1, 3);
        else if ((a[x][y] == 92) && h == 2)
            dfs(x, y + 1, 1, 4);
        else if (a[x][y] == ‘.‘&&h == 1)    //上
            dfs(x - 1, y, 1, 1);
        else if (a[x][y] == ‘/‘&&h == 1)
            dfs(x, y + 1, 1, 4);
        else if (a[x][y] == 92 && h == 1)
            dfs(x, y - 1, 1, 3);
        else if (a[x][y] == ‘.‘&&h == 3)    //左
            dfs(x, y - 1, 1, 3);
        else if (a[x][y] == ‘/‘&&h == 3)
            dfs(x + 1, y, 1, 2);
        else if (a[x][y] == 92 && h == 3)
            dfs(x - 1, y, 1, 1);
        else if (a[x][y] == ‘.‘&&h == 4)    //右
            dfs(x, y + 1, 1, 4);
        else if (a[x][y] == ‘/‘&&h == 4)
            dfs(x - 1, y, 1, 1);
        else if (a[x][y] == 92 && h == 4)
            dfs(x + 1, y, 1, 2);
    }
}
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++)
            cin >> a[i][j];
    }
    for (int i = 1; i <=m; i++)
    {
        dfs(1,i,1,2);
    }
    return 0;
}

J:

剛開始想復雜了,又是求排列,又是求組合,做了一個半小時,頭都炸了,後來放棄了,做完i題又回來看了看,發現ac的人六百多,肯定沒我想的那麽復雜啊,又回頭看了看,其實就是3^m,快速冪模版套上,a了。

#include<bits/stdc++.h>
using namespace std;
#define mod 998244353
#define ll long long
ll qmi(ll a, ll b, ll p)
{
    ll res = 1;
    while (b)
    {
        if (b & 1) res = (res * a) % p;
        a = (a * a) % p;
        b = b >> 1;
    }
    return res;
}
int main()
{
    ll m, ans, x = 2;
    while (cin >> m)
    {
        ans = qmi(3, m, mod);
        cout << ans << endl;
    }
    return 0;
}

  

牛客集訓營第五場補題