2022“杭电杯”中国大学生算法设计超级联赛(4)(4,6,7)

第4题

有一个大的等边三角形,边长n.大三角形由n^2具有边长的小等边三角形1.链接将使用以下限制将数字填充到小三角形的每个顶点中:填写的数字应为0,1或2.·大三角形的左侧不应填充0.大三角形的右侧不应填充1.大三角形的底边不应填充2.·对于每个具有边长的小三角形1,三个顶点之和不应是3.当林克试图这样做时,他发疯了,因为他找不到任何满足上述所有条件的三角形。现在,他向你寻求帮助。请告诉Link:是否可以填充三角形以使其满足上述所有条件?

这道题目卡了我们很久,一直希望可以找出几个样例来找规律,然后我们就尝试了n=3,4,5,6.但都是找不出符合要求的图形。后面才想到,有没有一种可能,这种图形压根就不存在,所以抱着试试看的想法我们居然过了,确实离谱。原本以为是找规律题,原来他压根就不存在。

#include<bits/stdc++.h>
using namespace std;
int n,m;
int main(){
	cin>>n;
	for (int i=1;i<=n;i++){
		cin>>m;
		cout<<"No"<<endl;
	}
	return 0;
}

非常简单的代码,算是一道签到题了,不过我们找规律浪费了好长时间。

第6题

BIT(北京国际交通)地铁可以在短时间内将人们带到任何地方,是2050年最受欢迎的出行方式。有一天,BIT地铁推出如下促销活动:

  • 如果总票价x您本月花费的金额大于或等于100,并且您用¥购买了另一张机票y,那么你只需要支付¥0.8年.
  • 如果总票价x您本月花费的金额大于或等于 200,并且您用 ¥ 购买了另一张机票y,那么你只需要支付¥0.5年.

DLee非常高兴,他可以攒更多的钱买房子。然而,很久以后,他注意到真正的计费方式与他想象的有点不同。例如,DLee本月花了199日元买了票,他现在买了一张10日元的票,然后买了一张8元的票:

  • DLee认为他一次只能买一部分票,而不是整张票。也就是说,对于10日元的门票,DLee认为他可以先买到1.25日元的部分门票,然后再买8.75日元的部分门票。在他的误解下,他需要花钱199+1.25*0.8+8.75*0.5+8*0.5=¥208.375.请注意,在此示例中,DLee必须花费¥1.25,而不仅仅是¥1才能制作x=200.
  • 真正的计费方式是,只有你花了足够的钱,你才能得到折扣,所以它会199+10∗0.8+8∗0.5=¥211元.

现在DLee想知道在之前的几个月里,计费方式有多大的区别。

也是一道模拟题,对着题意写就好了,不过过程还是比较复杂的,需要小心考虑。

#include<bits/stdc++.h>
using namespace std;
double a[100010];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--){
		int n;
		scanf("%d",&n);
		double ans=0;
		for(int i=1;i<=n;i++){
			scanf("%lf",&a[i]);
		}
		double res=0;
		for(int i=1;i<=n;i++){
			
			if(res>=200) res+=a[i]*0.5;
			else if(res>=100) res+=a[i]*0.8;
			else res+=a[i];
		}
		for(int i=1;i<=n;i++){
			if(ans<100){
				if(ans+a[i]<100) ans+=a[i];
				else{
					double cnt=100-ans;
					ans+=cnt;
				//	double x=a[i]-cnt;
					a[i]-=cnt;
					if(ans+a[i]*0.8>=200){
						double cnt=200-ans;
						ans+=cnt;
					//	double m=x-cnt/0.8;
						a[i]-=cnt/0.8;
						ans+=a[i]*0.5;
					}
					else {
						ans+=a[i]*0.8;
					}
				}
			}
			else if(ans>=100&&ans<200){
				if(a[i]*0.8<200-ans) ans+=a[i]*0.8;
				else{
					double cnt=200-ans;
					ans+=cnt;
					//double x=a[i]-cnt/0.8;
					a[i]-=cnt/0.8;
					ans+=a[i]*0.5;
				}
			}
			else {
				ans+=a[i]*0.5;
			}
		}
		
		printf("%.3lf %.3lf\n",ans,res);
	}
}

第7题

DLee进入了一个新的水平。等待他的是一座高楼大厦nn楼层,每个楼梯上都有一个怪物,我-其中有生命值a_i​.

DLee从地面(可视为0楼)开始,有一个基地攻击点a_0a0​.他可以选择跳跃1,2点,k1,2,...,k地板向上或步行1地板向下,但他不能去怪物的生命值严格大于他的攻击点的楼层,也不能去去过的楼层。一旦他来打败一个怪物,他可以吸收他的生命值,并将其添加到他的攻击点。

请注意,DLee应始终在地板上{0,1,2,3,\dots,n}0,1,2,3,...,n.

现在DLee问你是否有可能打败所有的怪物并通过关卡。

就是询问有没有在大于所处位置的数字,并且可以保障访问每一个位置,难度确实存在,我们最开始用的是贪心,然后就一直wa,之后我们又试了模拟搜索,但也是wa了。

后面看题解才知道是后缀和以及二分答案,但比赛的时候确实没往这方面思考。

#include <bits/stdc++.h>
#define int long long
#define endl "\n"
#define PII pair<int, int>
using namespace std;

const int N = 1e5 + 10;
int a[N];
int sum[N];
int now;
bool check(int mid, int pos) {
    if (sum[pos + 1] - sum[mid + 1] + now >= a[pos])
        return 0;
    else
        return 1;
}

void solve() {
    int n, k;
    cin >> n >> now >> k;
    for (int i = 1; i <= n + 10; i++)
        sum[i] = 0;

    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int i = n; i >= 1; i--)  //后缀
        sum[i] = sum[i + 1] + a[i];

    int maxx = 0, pre = 1;
    for (int i = 1; i <= n; i++) {
        int l = i + 1, r = n + 1;
        while (l < r) {
            int mid = l + r >> 1;
            if (check(mid, i))
                l = mid + 1;
            else
                r = mid;
        }
        // cout << l << endl;
        if (now >= a[i])
            l = i;
        if (l >= min(pre + k, n + 1)) {  //大于k
            cout << "NO" << endl;
            return;
        }
        maxx = max(maxx, l);
        if (l >= maxx && l == i) {
            now += sum[pre] - sum[maxx + 1];
            pre = i + 1;
            maxx = 0;
        }
    }
    cout << "YES" << endl;
}
signed main() {
    int T = 1;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值