洛谷欢乐赛【11月】题解
  • 板块学术版
  • 楼主huangtianzeC
  • 当前回复12
  • 已保存回复12
  • 发布时间2023/11/10 19:58
  • 上次更新2023/11/10 20:09:25
查看原帖
洛谷欢乐赛【11月】题解
1067401
huangtianzeC楼主2023/11/10 19:58

事先声明:本人就是洛谷欢乐赛【11月】主办方

#A

#include <iostream>
#include <cstdio>
using namespace std;
int main() {
    int a,b;
    cin >> a >> b;
    cout << a+b;
    return 0;
}

#B

#include <bits/stdc++.h>
using namespace std;
int x[10000001],y[100000001],ans,sum,w,h,qx,qy;
char c[1001][1001];
bool flag[1001][1001];
int py[]={0,-1,0,1,0},px[]={0,0,1,0,-1};//上下左右 
int se(int sy,int sx){
//	cout<<sy<<" "<<sx<<endl;
	for(int i=1;i<=4;i++){
		int dy=py[i]+sy,dx=px[i]+sx;
		if(flag[dy][dx]==0&&c[dy][dx]=='.'&&dy<=h&&dy>0&&dx<=w&&dx>0){
			flag[dy][dx]=1;
			sum++;
			se(dy,dx);
		}
	}
}
int main(){
	cin>>w>>h;
	for(int i=1;i<=h;i++)
		for(int j=1;j<=w;j++){
			cin>>c[i][j];
			if(c[i][j]=='@')qx=j,qy=i;
		}
	sum++;
	flag[qy][qx]=1;
	se(qy,qx);
	cout<<sum<<endl;
	return 0;
}

#C

#include <cstdio>

typedef long long ll;

const int N = 1e5 + 5;

ll n, d;
ll dis[N], money[N], nxt[N], dis_sum[N], can_dis, ans;

int main()
{
	//freopen("road.in", "r", stdin);
	//freopen("road.out", "w", stdout);
	scanf("%lld %lld", &n, &d);
	ll i, dist, last_m, last_i;
	for (i = 1; i < n; i++)
		scanf("%lld", &dis[i]);
	for (i = 2; i <= n; i++)
		dis_sum[i] = dis_sum[i - 1] + dis[i - 1];// 计算从 1 到 i 的距离
	for (i = 1; i <= n; i++)
		scanf("%lld", &money[i]);
	last_m = money[1];
	last_i = 1;
	for (i = 2; i <= n - 1; i++)
	{
		if (money[i] < last_m)// 遇到比上一个加油站便宜的
		{
			nxt[last_i] = i;// 类似与链表的方式存储下一个加油站
			last_i = i;
			last_m = money[i];
		}
	}
	nxt[last_i] = n; // 要到 n 号点,可以把 n 号点看作价钱位 0
	for (i = 1; i < n;)
	{
		dist = dis_sum[nxt[i]] - dis_sum[i];
		ans += (dist - can_dis + d - 1) / d * money[i];// 要考虑还剩多少油
        	// can_dis 表示还能开多少距离
		can_dis += (dist - can_dis + d - 1) / d * d; // 注意油量要向上取整
		can_dis -= dist;
		i = nxt[i];// 向下一个加油站开
	}
	printf("%lld\n", ans);
	return 0;
}

#D

#include <iostream>
using namespace std;

int main()
{
    int a, b;
    cin >> a >> b;
    //特判 
    if(a == 1)
    {
        cout << 1 << endl;
        return 0;
    }
    if(b == 1)
    {
        cout << a << endl;
        return 0;
    }
    if(a > 31622)
    {
        cout << -1 << endl;
        return 0;
    }
    if(b > 29)
    {
        cout << -1 << endl;
        return 0;
    }
    long long fac = 1;
    for(int i = 1;i <= b;i++) //i 表示准备乘上第 i 个 a 
    {
        if((1e9 / double(fac)) < a) //准备乘上的时候看看是否超出限制 
        {
            cout << -1 << endl;
            return 0;
        }
        fac *= a;
    }
    cout << fac << endl;
    return 0;
} 

#E

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int size = 5005;
int a[size];
int main()
{
    int L,N;
    cin>>L>>N;
    if (!N) //特判 N==0的情况 
    {
        cout<<"0 0"<<endl;
        return 0;
    }
    for (int i=1;i<=N;i++) cin>>a[i]; //输入
    sort(a+1,a+N+1); //从小到大排序(算最长时间时可能方便一些)
    int max_time,min_time;
    for (int i=1;i<=N;i++)
        min_time=max(min(a[i],L+1-a[i]),min_time); //最短时间就是所有人中走完桥最小值中的最大值 
    max_time=max(L+1-a[1],a[N]); //最长时间就是最靠近端点两个人各自向对方走,
                                 //时间较长的那个人的时间 (排序的好处)
    cout<<min_time<<' '<<max_time<<endl;
    return 0;
}
2023/11/10 19:58
加载中...