2024-3-1-1015-摘花生.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N =105;
int res;
int T,R,C,M[N][N],F[N][N];
int main()
{
cin>>T;
while(T--)
{
scanf("%d%d",&R,&C);
for(int i=1;i<=R;i++)
for(int j=1;j<=C;j++)
scanf("%d",&M[i][j]);
for(int i=1;i<=R;i++)
for(int j=1;j<=C;j++)
{F[i][j]=M[i][j];
F[i][j]+=max(F[i-1][j],F[i][j-1]);
}cout<<F[R][C]<<endl;

}
return 0;
}

2024-2-29-02-01背包问题.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1005;

int n,m;
int v[N],w[N];
int f[N][N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%d%d",&v[i],&w[i]);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{f[i][j]=f[i-1][j];
if(j>=v[i]) f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);


}

printf("%d\n",f[n][m]);
return 0;
}

2024-2-29-503-借教室.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+10;
struct st{
int d,s,t;
};
st s[N];
int n,m;
int r[N];
long long diff[N];
bool check(int m)
{memset( diff, 0, sizeof diff);
for(int i=1;i<=m;i++)
{ diff[s[i].s]+=s[i].d;
diff[s[i].t+1]-=s[i].d;}

for(int i=1;i<=n;i++)
{diff[i]+=diff[i-1];
if(r[i]<diff[i])
return false;}

return true;

}

int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%d",&r[i]);
for(int i=1;i<=m;i++)
scanf("%d%d%d",&s[i].d,&s[i].s,&s[i].t);

int l=1,r=m;
while(r>l)
{int mid=(r+l+1)>>1;
if(check(mid))
l=mid;
else r=mid-1;
}

if(l==m)
cout<<0;
else cout<<-1<<endl<<r+1;

return 0;
}

2024-2-28-1205-买不到的数目.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
cout<<(n-1)*(m-1)-1;
return 0;

}

2024-2-28-1216- 饮料换购.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int res;
int main()
{
int n;
cin>>n;
int res=n;
while(n>=3)
{
res+=n/3;
n=n/3+n%3;
}
cout<<res;
return 0;

}

公式

*** a/b,向上取整位(a+b-1)/b ***

2024-2-28-1230-K倍区间.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <cstring>
#include <algorithm>
#include<cstdio>
const int N = 1e5+10;
int n,k;
long long s[N],cnt[N];//防止出现数据过大


using namespace std;
int main()
{scanf("%d%d",&n,&k);
for (int i = 1; i <= n; i ++ )
{int m;
scanf("%d", &m);
s[i]=s[i-1]+m;
}

long long res=0;//防止出现数据过大
cnt[0] = 1;
for(int r=1;r<=n;r++)
{int mod=s[r]%k;
res+=cnt[mod];
cnt[mod]++;
}
cout<<res;

return 0;
}

2024-2-28-99-激光炸弹.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int N=5010;

int n,m; int cnt,r; int s[N][N];

int main() { cin>>cnt>>r; r=min(5001,r); n=m=r;

while(cnt--)
{
int x,y,w;
cin>>x>>y>>w;
x++,y++;
n=max(n,x),m=max(m,y);
s[x][y]+=w;
}

for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];//二维前缀和

int res=0;
for(int i=r;i<=n;i++)
for(int j=r;j<=m;j++)
res=max(res,s[i][j]-s[i-r][j]-s[i][j-r]+s[i-r][j-r]); //计算滑动窗口中的最大值

cout<<res<<endl;
return 0;
}

2024-2-27-796-子矩阵的和.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1005;
int a[N][N],s[N][N],ans[N];
int n,m,q,x1,x2,y1,y2,z;
int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{scanf("%d",&a[i][j]);
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
}
while(q--)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
printf("%d",s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1]);
}
return 0;

}

2024-2-27-795-前缀和.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=100010;
int n,m;
int a[N],s[N];
int main()
{

scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
s[i]=s[i-1]+a[i];
}
while(m--)
{ int r,l;
scanf("%d%d",&l,&r);
printf("%d\n",s[r]-s[l-1]);
}
return 0;
}

0%