ACM预备队-week12
1.宝物筛选
题目链接:P1776 宝物筛选 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
其实就是多重背包的二进制优化问题,转化成简单的01背包即可,滚动数组也可以去优化
注意的是告诉的是最大载重(背包问题中的最大体积),所以应该是减去w[i]而不是v[i]
1 #include <bits/stdc++.h>
2 using namespace std;//多重背包的二进制优化
3 const int N=1e6+10;
4 int v[N],w[N],f[N];
5 int n,m;
6
7 signed main()
8 {
9 ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
10 cin>>n>>m;
11 int cnt=0;
12 for(int i=1;i<=n;i++)
13 {
14 int a,b,s;
15 cin>>a>>b>>s;
16 int k=1;//组别里面的个数
17 while(k<=s)
18 {
19 cnt++;//组别先增加
20 v[cnt]=a*k;//整体体积
21 w[cnt]=b*k;//整体价值
22 s-=k;//s要减小
23 k*=2;//组别里面的个数以二进制增加
24 }
25 if(s>0)
26 {
27 cnt++;
28 v[cnt]=a*s;
29 w[cnt]=b*s;
30 }
31 }
32 n=cnt;//枚举次数正式由个数变成组别数
33 //01背包优化
34 for(int i=1;i<=n;i++)
35 for(int j=m;j>=w[i];j--)//此时m是载重,所以应该是>=w[i],开始我写成v[i]了qwq
36 f[j]=max(f[j],f[j-w[i]]+v[i]);
37
38 cout<<f[m]<<endl;
39 return 0;
40 }
2.尴尬的数字
题目链接:P1555 尴尬的数字 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
本题考的就是模拟,就是将一个字符串转化成二进制数,然后把这个二进制数每一位都取反,再转化成三进制数,如果转化出的数和原来给的三进制数只差一位,则就是这个数,输出即可,否则循环
1 #include <bits/stdc++.h>
2 using namespace std;
3 //本题的思路就是遍历二进制中哪个数字错了,然后再将其转化为三进制数,如果仅有一个数字不同,则说明就是这个数
4 signed main()
5 {
6 ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
7 string s1,s2;
8 cin>>s1>>s2;
9 for(int i=0;i<s1.size();i++)
10 {
11 long long ans=0;
12 if(s1[i]=='1')s1[i]='0';
13 else s1[i]='1';//先一个数字一个数字的改变
14 for(int j=0;j<s1.size();j++)
15 {
16 ans*=2;
17 ans+=(s1[j]-'0');
18 }//此时ans存的就是串1的二进制数,接下来要把这个二进制数转化为三进制数用于一一对比
19 int pos=s2.size()-1,cnt=0,flag=1;//cnt代表计数转化后不同的数字有几个,超过两个及以上,直接否定,flag表示判断,用于最后输出
20 long long temp=ans;//备份一份
21 while(pos>=0)
22 {
23 if((temp%3)!=s2[pos]-'0')cnt++;
24 pos--;
25 temp/=3;
26 if(cnt==2)
27 {
28 flag=0;
29 break;
30 }
31 }
32 if(flag==1)cout<<ans<<endl;
33 if(s1[i]=='1')s1[i]='0';
34 else s1[i]='1';//还原
35
36 }
37 return 0;
38 }
3.【传智杯】小卡和质数
题目链接:P8845 [传智杯 #4 初赛] 小卡和质数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
本题其实是个脑筋急转弯,因为给T组数据,每次输入一个a,b表示第a个质数和第b个质数的异或,这些数在二进制中异或如果是1的话,只能是二进制数最后一位数不同,其余都相同,也就是相差2^0=1,所以相差为1的质数(一奇一偶)只有2和3,分别为第1和2个质数
1 #include <bits/stdc++.h>
2 using namespace std;
3 int t,a,b;
4 signed main()
5 {
6 ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
7 cin>>t;
8 while(t--)
9 {
10 cin>>a>>b;
11 if((a==2&&b==1)||(a==1&&b==2))cout<<"Yes"<<endl;
12 else cout<<"No"<<endl;
13 }
14 return 0;
15 }
你本无意穿堂风,偏偏孤倨引山洪。

浙公网安备 33010602011771号