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 }标签:cnt,week12,cout,int,质数,cin,ACM,tie,预备队 From: https://www.cnblogs.com/Zac-saodiseng/p/17065110.html