一、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 l r
,表示将 l≤i≤r 的所有 si 取反(00 变 11,11 变 00);2 g
(∈{0,1})(g∈{0,1}),表示将所有si=g 的 ai 求异或和;
这道题没补过
六、Selling a Menagerie
题目描述
动物园里有 n 个动物,第 i 个动物害怕第 ai 个动物,第 i 个动物价值 ci 元。现在我要将这些动物全部卖掉。显然,卖的动物编号可以构成一个排列 p。
考虑卖掉这些动物时:
- 若 ai 在 i 还没有卖掉之前就被卖掉了,现在卖掉 i,可以获得 ci 元;
- 若 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,最大化总贡献。