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)
记一下结论吧
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;
}
标签:48,idx,idy,int,mp,测试,ans
From: https://www.cnblogs.com/2025ing/p/18671384