A - 分饼干 I
将三盒饼干按数量排序。若较小的两盒饼干数之和大于另一盒饼干,则将较小的两盒饼干奖励给第一名,另一盒奖励给第二名;若较大的一盒饼干数大于另外两盒之和,则将较大的一盒奖励给第一名,另外两盒奖励给第二名。
B - 分饼干 II
每个人分到的饼干数都不同,即可以看作一个等差数列。若 (1+k)*k/2>=n
,输出 Yes
,否则输出 No
。
C - 跳房子
初始下标 \(i\) 从 \(1\) 开始,每次增加 \(a_i\),直到 \(i\ge n\)。如果 \(i=n\) 则输出 Yes
,否则输出 No
。第二问就在跳的时候加一个计数器即可。
D - 区间函数最小值
双重循环枚举 \(x\) 和 \(y\) 计算。为了防止溢出,在计算 \(f(x,y)\) 的时候要边算边取余。
核心代码
int a,b,c,d,e,f,g,p;
int func(int x,int y){
return (a*x%p*x%p*x%p + b*y%p*y%p*y%p + c*x%p*x%p*y%p + d*x%p*y%p*y%p + e*x%p*y%p + f*x%p + g*y%p) %p;
}
E - 小跳蛙
存储空位的位置以及每个小跳蛙所在的位置。循环遍历,每次将第 \(i\) 个小跳蛙的位置与空位交换,起到跳跃的效果。由于只需要查找一次,所以小跳蛙的位置不需要更新。
核心代码:
const int N=1e6+5;
int a[N],t[N],n,k;
for(int i=1;i<=n;i++){
if(a[i]==0) k=i;
else t[a[i]]=i;
}
for(int i=1;i<n;i++){
int c=t[i];
swap(a[c],a[k]);
k=c;
}
G - 二进制与一
枚举 \(x\),看 \(n+x\) 的第 \(k\) 位是否等于 1。
核心代码:
int n,q;
while(q--){
int k;
if((n>>(k-1))&1) continue;
int x=0;
while(true){
int tmp=n+x;
if((tmp>>(k-1))&1) break;
x++;
}
ans+=x;n+=x;
}
H - Genshin 玩家
由于子串长度固定,枚举开头元素再取 substr
,判断是否为所需要的字符即可。
核心代码
int cnt=0;
for(int i=0;i<s.size();i++){
string Genshin=s.substr(i,7);
if(Genshin!="Genshin") continue;
for(int j=i+1;j<s.size();j++){
string player=s.substr(j,6);
if(player!="player") continue;
cnt++;
}
}
标签:洛谷,19,题解,y%,x%,一盒,int,饼干,两盒
From: https://www.cnblogs.com/Death-Basic/p/17976108/luogu-started-19