- 伍衍 的博客
DAY7
- @ 2024-7-15 18:52:51
考试错误:一遍的,没发生错误。
思路:
.先定义一个i。
.然后循环直到->。
.最后输出-。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
freopen("aoteman.in","r",stdin);
freopen("aoteman.out","w",stdout);
int n;
cin >> n;
int x=1;
for(int i=1;x<=n;i++){
x=(1<<i)-1;
}
cout << x;
}
考试错误:暴力骗分,没发生错误。
思路:
.首先对每一行求出差分数组(可省略,无影响)。
.用一维差分求出每行轰炸范围,并用差分将范围里的数+。
.最后求前缀和并&,求出一的个数。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e3+50;
int f[N][N];
int x,y,r;
signed main(){
freopen("boom.in","r",stdin);
freopen("boom.out","w",stdout);
int n,m;
cin >> n >> m;
for(int i=1;i<=m;i++){
cin >> x >> y >> r;
for(int i=1;i<=n;i++){
int k=r-abs(i-x);
if(k<0) continue;
int _1=1;
int l=max(y-k,_1),r=min(y+k,n);
f[i][l]++;
f[i][r+1]--;
}
}
int cnt=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
f[i][j]+=f[i][j-1];
cnt+=f[i][j]%2;
}
}
cout << cnt;
}
考试错误:这一题不会,没有做出来。
思路:
一道大模拟,需要用两个数组,表示1~i与i~n之间最多有多少个钻石放在一起。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+50;
int a[N],l[N],r[N];
signed main(){
freopen("demon.in","r",stdin);
freopen("demon.out","w",stdout);
int n,k;
cin >> n >> k;
for(int i=1;i<=n;i++){
cin >> a[i];
}
sort(a+1,a+n+1);
for(int i=1,j=1;i<=n;i++){
while(j<=i&&a[i]-a[j]>k){
j++;
}
l[i]=i-j+1;
}
for(int i=1;i<=n;i++){
l[i]=max(l[i-1],l[i]);
}
for(int i=n,j=n;i>0;i--){
while(j>=i&&a[j]-a[i]>k&&j>0){
j--;
}
r[i]=j-i+1;
}
int mx=0;
for(int i=n;i>0;i--){
r[i]=max(r[i+1],r[i]);
}
for(int i=1;i<=n;i++){
mx=max(l[i]+r[i+1],mx);
}
cout << mx;
}
考试错误:一遍的,无。
思路:
纯模拟,算法都没考,思路按题目要求来,过于简单,此处略。
代码:
#include <bits/stdc++.h>
using namespace std;
int a[15][15];//地图
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
int main(){
freopen("cow.in","r",stdin);
freopen("cow.out","w",stdout);
int ti,tj,ci,cj;//小田与牛的坐标
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') ti=i,tj=j;
if(c=='C') ci=i,cj=j;
}
}
int tf=0,cf=0,cnt=0;//方向、计数
while(ti!=ci||tj!=cj){
int nti=ti+dx[tf],ntj=tj+dy[tf];//小田位置
int nci=ci+dx[cf],ncj=cj+dy[cf];//牛位置
bool ft=0,fc=0;
if(nti<1||ntj<1||nti>10||ntj>10){
tf++;
if(tf==4) tf=0;
ft=1;
}if(nci<1||ncj<1||nci>10||ncj>10){
cf++;
if(cf==4) cf=0;
fc=1;
}if(a[nti][ntj]==1){
tf++;
if(tf==4) tf=0;
ft=1;
}if(a[nci][ncj]==1){
cf++;
if(cf==4) cf=0;
fc=1;
}if(ft==0||fc==0){
if(ft==0){
ti=nti,tj=ntj;
}if(fc==0){
ci=nci,cj=ncj;
}
}
cnt++;
if(cnt==1e7){ //次数过多,直接return 0;
cout << 0;
return 0;
}
}
cout << cnt;
}