- chenshixian 的博客
陈室先的总结7.15day7
- @ 2024-7-15 19:00:20
题目传送门🚁🚡🛫🚀🛸
T1小田不想打怪兽😕
👌思路
我们可以发现,当这个数被分为两个这个数除2是,这个数与另一个数除的次数也一样,所以我们可以用循环,每次n/2;计数变量加上个数
代码🎊
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("aoteman.in","r",stdin);
freopen("aoteman.out","w",stdout);
long long n,s=0,l=1;
cin>>n;
while(n){
n/=2;
s+=l;
l*=2;
}
cout<<s;
}
T2小田的异或炸弹😕 😕
错的地方🤮
1.我虽然想到了差分,但还是没想到按行差分,只用了暴力标记,以后要多多扩展代码能力
👍 思路
我们可以在每次输入后枚举行,然后判断每行有没有被影响,如果会影响,后再看他起始位置与终止位置,差分; 最后求每一位的前缀和,如果为奇数,就记下来
🤧代码
#include<bits/stdc++.h>
using namespace std;
int a[3010][3010],f[3010][3010],n,m,s;
int main(){
freopen("boom.in","r",stdin);
freopen("boom.out","w",stdout);
cin>>n>>m;
while(m--){
int x,y,b;
cin>>x>>y>>b;
for(int i=1;i<=n;i++){
int k=b-abs(x-i);
if(k>=0){
int l=max(1,y-k),r=min(n,y+k);
f[i][l]++;
f[i][r+1]--;
}
}
}
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){f[i][j]=f[i][j-1]+f[i][j];if(f[i][j]%2)s++;}
cout<<s;
}
3.小田的钻石😄 😄
错的点😡
双指针没用好,要加强熟练度
思路😶
用两个双指针来维护,第一个为从左到右可行区间,第二个为从右到左可行的区间,最后求max
代码🍟
#include<bits/stdc++.h>
using namespace std;
int a[1000010],l[100010],r[100010],n,k;
int main(){
freopen("demon.in","r",stdin);
freopen("demon.out","w",stdout);
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
for(int i=1,j=1;j<=n;j++){
while(i<=j&&a[j]-a[i]>k)i++;
l[j]=max(l[j-1],j-i+1);
}
for(int i=n,j=n;i>=1;i--){
while(j>=i&&a[j]-a[i]>k)j--;
r[i]=max(r[i+1],j-i+1);
}
int an=0;
for(int i=1;i<=n;i++){
an=max(an,l[i]+r[i+1]);
}
cout<<an;
}
T5. 小田抓牛😄 😄
错的点👎
根本没写
思路😭
我们可以模拟小田与牛的行动轨迹,直到重合位置,而整个有160000种状态,如果大于及不行
代码🤑
#include <bits/stdc++.h>
using namespace std;
int a[15][15];
int dx[10]={-1,0,1,0};
int dy[10]={0,1,0,-1};
int main(){
freopen("cow.in","r",stdin);
freopen("cow.out","w",stdout);
int t1,t2,c1,c2;
for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
char c;
cin>>c;
if(c=='*') a[i][j]=1;
else a[i][j]=0;
if(c=='T')t1=i,t2=j;
if(c=='C')c1=i,c2=j;
}
}
int t=0,c=0,cn=0;
while(t1!=c1||t2!=c2){
int ti=t1+dx[t],tj=t2+dy[t],ci=c1+dx[c],cj=c2+dy[c];
bool nt=0,nc=0;
if(ti<1||tj<1||ti>10||tj>10){
t++;
if(t==4)t=0;
nt=1;
}
if(ci<1||cj<1||ci>10||cj>10){
c++;
if(c==4)c=0;
nc=1;
}
if(a[ti][tj]==1){
t++;
if(t==4)t=0;
nt=1;
}
if(a[ci][cj]==1){
c++;
if(c==4)c=0;
nc=1;
}
if(nt==0||nc==0){
if(nt==0)t1=ti,t2=tj;
if(nc==0)c1=ci,c2=cj;
}
cn++;
if(cn==2e5){
cout <<"0";
return 0;
}
}
cout<<cn;
}