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 } 
posted @ 2023-01-23 12:29  Zac-saodiseng  阅读(528)  评论(0)    收藏  举报