CF1872补题

一、Two Vessels

题目描述

两个装水a,b的杯子,用一个容量为c的勺子让他们水量相等,最少操作几次

思路

分情况讨论一下:

如果a=b,那么不需要操作;

如果a与b的差值小于c,需要1次操作;

如果a与b的差值被2c整除,需要|a-b|/(2c)次操作;

否则,需要|a-b|/(2c)+1次操作

AC代码

#include<bits/stdc++.h>
using namespace std;
int t,a,b,c;
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d %d %d",&a,&b,&c);
        if(a==b)printf("0\n");
        else if(abs(a-b)<c||abs(a-b)%(2*c))printf("%d\n",abs(a-b)/(2*c)+1);
        else printf("%d\n",abs(a-b)/(2*c));
    }
    return 0;
}

 

二、The Corridor or There and Back Again

题目描述

有若干个房间排成一行,其中有n个房间有陷阱,对于这 n 个房间,它们有两个属性:di​ 和 si​,分别代表标号和陷阱形成的时间,即若你第 t 秒第一次到达 i 号房间,t+si​ 秒时陷阱就会在此房间形成,此后你无法通过此房间。每秒你可以走到与当前房间标号相邻的房间。你需要从 1 号房间走到 k 号房间,并且再从 k 号房间走回 1 号房间。求 k 最大是多少。

思路

首先一定要找一个最早出现陷阱的,由题意得是需要找从d[i]出发经过s[i]秒后出现陷阱这个时间最短。因为要折返,所以还需要除以二,并得向下取整。

所以是求最小的

d[i]+(s[i]+1)/2

打擂台求就可以了。

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int t,n;
int d[N],s[N];
int main(){
	scanf("%d",&t);
	while(t--){
		int mn=0x3f3f3f3f;scanf("%d",&n);
		for(int i=1;i<=n;i++){scanf("%d %d",&d[i],&s[i]);mn=min(d[i]+(s[i]+1)/2,mn);}
		printf("%d\n",mn-1);
	}
	return 0;
}

 三、Non-coprime Split

题目描述

给出l,r构造一组 a,b 使满足l<=a+b<=r,gcd(a,b)!=1

思路

遍历l~r区间,对于每个数m,寻找它的最小因子。(不算1和它本身)

若找出p,则m=kp,m-p=(k-1)p,两数不互质。

若找不出,则无解。

AC代码

#include<bits/stdc++.h>
using namespace std;
int t,l,r,f;
int ff(int x){
	for(int i=2;i*i<=x;i++)
		if(x%i==0)return i;
	return 0;
}
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d %d",&l,&r);f=0;
		for(int i=l;i<=r;i++)
			if(ff(i)){printf("%d %d\n",ff(i),i-ff(i));f=1;break;}
		if(!f)printf("-1\n");
	}
	return 0;	
}

四、Plus Minus Permutation

题目描述

给定三个整数n,x,y,对于 n 的排列 p,有score(p)=(px​+p2x​+p3x​+…+p⌊n/x​⌋⋅x​)−(py​+p2y​+n/y​⌋⋅y​)。求可能的最大score。

思路

为了让差值最大,Pkx尽可能大,Pky尽可能小

AC代码

#include<bits/stdc++.h>
#define int long long 
using namespace std;
int t,a,b,c,n,ca,cb,cc;
int gcd(int x,int y){
	if(x<y)swap(x,y);
	if(x%y)return gcd(y,x%y);
	return y;
}
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d %d %d",&n,&a,&b);
		c=a*b/gcd(a,b);ca=n/a,cb=n/b,cc=n/c;ca-=cc,cb-=cc;
		printf("%d\n",(n+n-ca+1)*ca/2-(1+cb)*cb/2);
	}
	return 0;
}

五、Data Structures Fan

题目描述

给定一个长度为 n 的数组和一个长度为 n 的二进制串 s,现有两个操作:

  1. 1 l r,表示将 l≤i≤r 的所有 si​ 取反(00 变 11,11 变 00);
  2. 2 g(∈{0,1})(g∈{0,1}),表示将所有si​=g 的 ai​ 求异或和;

这道题没补过

六、Selling a Menagerie

题目描述

动物园里有 n 个动物,第 i 个动物害怕第 ai​ 个动物,第 i 个动物价值 ci​ 元。现在我要将这些动物全部卖掉。显然,卖的动物编号可以构成一个排列 p。

考虑卖掉这些动物时:

  1. 若 ai​ 在 i 还没有卖掉之前就被卖掉了,现在卖掉 i,可以获得 ci​ 元;
  2. 若 ai​ 在 i 还没有卖掉之前没被卖掉,现在卖掉 i,可以获得 2⋅ci​ 元;

构造并输出赚钱最多的动物卖出顺序。

 思路

对于不被任何动物害怕的动物,最先卖出他们,因为他们并不会对卖出其他动物产生影响,而对于剩下的可以重复这个过程,直到不存在任何满足条件的动物。

想到建立一个图,从 i 向 ai​ 连一条有向边,最后会形成多个互不影响的联通块,因为一个大小为 k 的联通块有且仅有 k 条边,且一个点不可能连出 22 条边,所以一个联通块最终会且只会产生一个环。

先删除一个点后,环将变成链,除了链尾的点,其他点都会造成两倍的贡献,考虑贪心,将点权最小的点设为链尾的点,那么最先删除的点就是环上连像它的点,它所害怕的点。

 暂时没有代码

七、Replace With Product

题目描述

定一个长度为 n 的数组 a,现在可以进行一次操作:

  • 选择两个正整数 l,r(l≤r),将 a[l…r] 的所有数删除,并替换为 i=l∏r ​ai​;

最后的总贡献为所有数的加和,请选择 l,r,最大化总贡献。

 这道题没有思路

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值