T1 饮料换购
记录额外的瓶盖数量
达到 3 个就加上一瓶
签到题
考场少打等号痛失36pts
Code
#include<bits/stdc++.h>
using namespace std;
int n,ans,peel;
int main(){
scanf("%d",&n);
while(n>0){
ans+=n;
peel+=n%3;
n/=3;
if(peel>=3)peel-=3,n++;
}
printf("%d",ans);
return 0;
}
T2 买不到的数目
数学题
数据范围抽象(是错的)
大概 long long
[dp/暴力] 直接 38 DIE
有注意力能注意到是 xy-x-y
没有注意力的(such as me)
记一下结论吧
或者......
以 Sample 4 和 7 举例
我们发现 若 x%4==0||x%7==0 则 x 一定可以
(1,7) Only 4
(7,14) 7以上 x%4=0或3均可 (7%4==3)
(14,21) 14以上 x%4=0或3或2 均可 (7%4==3 14%4==2)
21以上 一定可以了
发现答案应该在 (xy-2y,xy-y) 中
考虑最后一次补上的约束 21%4==1
so ans%x=(xy-y)%x=(-y)%x
右边界刚好满足
为了破掉整除y
我们减去 x 即可
ans=xy-x-y
QED!!!
(感谢 lbh123 的启发)
Code
#include<bits/stdc++.h>
using namespace std;
long long n,m;
int main(){
scanf("%lld%lld",&n,&m);
printf("%lld",n*m-n-m);
return 0;
}
T3 费解的开关
2^25 [dfs/bfs]
剪枝写好了18pts
写不好直接爆0pt
正解离谱 2^5 dfs
枚举第一排每一个按还是不按
用二进制
00000->11111 <=> 0->31
接下来如果当前位置为灭
就按其正下方的按钮
如此而无后效性
最后检查最后一排是否全 1
(因为下面没有了)
若全为一则统计答案
Code
#include<bits/stdc++.h>
using namespace std;
char mp[10][10],in[10][10];
int T,ans,answer;
void push(int idx,int idy){
mp[idx][idy]=((mp[idx][idy]-48)^1)+48;
mp[idx+1][idy]=((mp[idx+1][idy]-48)^1)+48;
mp[idx-1][idy]=((mp[idx-1][idy]-48)^1)+48;
mp[idx][idy+1]=((mp[idx][idy+1]-48)^1)+48;
mp[idx][idy-1]=((mp[idx][idy-1]-48)^1)+48;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>T;
while(T--){
answer=100;
cin>>(in[1]+1)>>(in[2]+1)>>(in[3]+1)>>(in[4]+1)>>(in[5]+1);
for(int it=0;it<=31;it++){
ans=0;
for(int i=1;i<=5;i++)for(int j=1;j<=5;j++)mp[i][j]=in[i][j];
if((it>>0)&1)push(1,1),++ans;
if((it>>1)&1)push(1,2),++ans;
if((it>>2)&1)push(1,3),++ans;
if((it>>3)&1)push(1,4),++ans;
if((it>>4)&1)push(1,5),++ans;
for(int j=1;j<5;j++)for(int k=1;k<=5;k++)if(mp[j][k]=='0')push(j+1,k),++ans;
if(mp[5][1]=='1'&&mp[5][2]=='1'&&mp[5][3]=='1'&&mp[5][4]=='1'&&mp[5][5]=='1')answer=min(answer,ans);
}
if(answer>6)cout<<"-1\n"; else cout<<answer<<"\n";
}
return 0;
}
T4 机器人跳跃问题
每次跳到都变成 2E-H
逆推即可
签到成功
Code
#include<bits/stdc++.h>
using namespace std;
const int N=100856;
const double eps=1e-7;
int n;
long long lable[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%lld",&lable[i]);
double ans=0.0;
for(int i=n;i>=1;i--)ans=(ans+lable[i])/2.0;
cout<<(long long)(ans+0.99999);
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库