2024-03-30竞赛笔记&周赛总结笔记

2024/3/30

先放个图搞笑一下awa

pFTtJaR.png

又双叒叕放2个好东西……

JIYU万能密码

我的LGLG.TOP

正片

T1药剂实验

(这题暴力也可以啊哈哈哈)

pFTtK2T.jpg

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
//这做法怎么这么S*啊......
#include<iostream>
using namespace std;
int main()
{
int a,b,c,d,e,f,g,h,i,j,in,x=0;
cin>>in;
for (a=1;a<=3;a++)
{
for (b=1;b<=3;b++)
{
for (c=1;c<=3;c++)
{
for (d=1;d<=3;d++)
{
for (e=1;e<=3;e++)
{
for (f=1;f<=3;f++)
{
for (g=1;g<=3;g++)
{
for(h=1;h<=3;h++)
{
for (i=1;i<=3;i++)
{
for (j=1;j<=3;j++)
{
if (a+b+c+d+e+f+g+h+i+j==in)
{
x++;
}
}
}
}
}
}
}
}
}
}
}
cout<<x<<endl;
for (a=1;a<=3;a++)
{
for (b=1;b<=3;b++)
{
for (c=1;c<=3;c++)
{
for (d=1;d<=3;d++)
{
for (e=1;e<=3;e++)
{
for (f=1;f<=3;f++)
{
for (g=1;g<=3;g++)
{
for(h=1;h<=3;h++)
{
for (i=1;i<=3;i++)
{
for (j=1;j<=3;j++)
{
if (a+b+c+d+e+f+g+h+i+j==in)
{
cout<<a<<" ";
cout<<b<<" ";
cout<<c<<" ";
cout<<d<<" ";
cout<<e<<" ";
cout<<f<<" ";
cout<<g<<" ";
cout<<h<<" ";
cout<<i<<" ";
cout<<j<<endl;
}
}
}
}
}
}
}
}
}
}
}
}

T2装饰

完全没有想到是完全背包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[10001];//第i种花的数量
int f[114][514];//前i种花在花盆数量为j的方案数
const int mod=1e6+7;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
f[0][0]=1;//全部不放也是一种方案数
for(int i=1;i<=n;i++){//物品
for(int j=0;j<=m;j++){//花盆数
for(int k=0;k<=j&&k<=a[i];k++){//第i种花取k盆
f[i][j]=(f[i][j]+f[i-1][j-k])%mod;
}
}
}
cout<<f[n][m];
}

T3星航补给

又双叒叕是一个DFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<bits/stdc++.h>
using namespace std;
int n,m,a[100001],l,r,ans;
void dfs(int x,int w){
if(x>n){
if(w>=l){//满足l~r
ans++;
}
return;
}
if(w+a[x]<=r){//剪枝:质量没有超过r,说明装了可能还在l~r
dfs(x+1,w+a[x]);//装
}
dfs(x+1,w);
}
int main(){
cin>>n>>l>>r;
for(int i=1;i<=n;i++) cin>>a[i];
dfs(1,0);
cout<<ans;
return 0;
}

T4乐队采购

nnd这题这么简单就AC了!降黄!降黄!降黄!降黄!降黄!降黄!降黄!

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<bits/stdc++.h>
using namespace std;
int n,m,s,ans;
struct node{
int w,v;
}b[114514];
bool cmp(node x,node y){
if(x.v==y.v){//重要度相等
return x.w<y.w;
}
else return x.v>y.v;
}
int main(){
cin>>n>>m;
s=m;
for(int i=1;i<=n;i++) cin>>b[i].w>>b[i].v;
sort(b+1,b+1+n,cmp);
int x=1;//取第一个数组的下标
for(int i=1;i<=n;i++){
if(m-b[i].w>=0){//可以放
if(abs(b[i].w-b[x].w)<=3) //与最大的差是否小于3
if(b[i].w>b[x].w) x=i;//取最大值的下表
m-=b[i].w;//放
ans+=b[i].v;
}
}
cout<<ans;
}

总结:

没有发挥好(怎么都t*用DFS做啊,我正好不太会),继续努力!