目录
1.宝物筛选
题目
终于,破解了千年的难题。小 FF 找到了王室的宝物室,里面堆满了无数价值连城的宝物。
这下小 FF 可发财了,嘎嘎。但是这里的宝物实在是太多了,小 FF 的采集车似乎装不下那么多宝物。看来小 FF 只能含泪舍弃其中的一部分宝物了。
小 FF 对洞穴里的宝物进行了整理,他发现每样宝物都有一件或者多件。他粗略估算了下每样宝物的价值,之后开始了宝物筛选工作:小 FF 有一个最大载重为 �W 的采集车,洞穴里总共有 �n 种宝物,每种宝物的价值为 ��vi,重量为 ��wi,每种宝物有 ��mi 件。小 FF 希望在采集车不超载的前提下,选择一些宝物装进采集车,使得它们的价值和最大。
输入格式
第一行为一个整数 �n 和 �W,分别表示宝物种数和采集车的最大载重。
接下来 �n 行每行三个整数 ��,��,��vi,wi,mi。
输出格式
输出仅一个整数,表示在采集车不超载的情况下收集的宝物的最大价值。
输入输出样例
输入 #1复制
4 20 3 9 3 5 9 1 9 4 2 8 1 3
输出 #1复制
47
题解
动态规划,确认好动态方程。
代码
#include<bits/stdc++.h>
using namespace std;
int n,V,ans,head,t,q[40010],q2[40010],dp[40010];
int main(){
cin>>n>>V;
for(int i=1;i<=n;i++){
int v,w,c;
cin>>w>>v>>c;
if(v==0){
ans += w*c;
continue;
}
int k=V/v;
c=min(c,k);
for(int d=0;d<v;d++){
head=t=0;
k=(V-d)/v;
for(int j=0;j<=k;j++){
while(head<t && dp[d+j*v]-j*w>=q2[t-1])
t--;
q[t]=j;
q2[t++]=dp[d+j*v]-j*w;
while(head<t && q[head]<j-c) ++head;
dp[d+j*v]=max(dp[d+j*v],q2[head]+j*w);
}
}
}
cout<<ans+dp[V];
return 0;
}
2.尴尬的数字
题目
Bessie 刚刚学会了不同进制数之间的转换,但是她总是犯错误,因为她的两个前蹄不能轻松的握住钢笔。
题目描述
每当 Bessie 将一个数转换成新的进制时,她总会写错一位数字。例如,她将 14 转化成 2 进制数,正确的结果是 1110,但她可能会写成 0110 或 1111。Bessie 从不会意外的增加或删减数字,所以她可能会写出以 0 开头的错误数字。
给出 Bessie 转换后 �N 的 2 进制形式和 3 进制形式,请计算出 �N 的正确数值(用十进制表示)。�N 可能会达到 109109,输入数据保证解的存在唯一性。
输入格式
第一行,�N 的 2 进制表示(有一位是错误的数字)。
第二行,�N 的 3 进制表示(有一位是错误的数字)。
输出格式
�N 的正确值。
输入输出样例
输入 #1复制
1010 212
输出 #1复制
14
题解
确认好二进制,依次进入。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m, a[105],b[105];
string s1,s2;
signed main(){
cin>>s1>>s2;
n=s1.size();
m=s2.size();
for(int i=1;i<=n;i++){
a[i]=s1[i-1]-'0';
}
for(int i=1;i<=m;i++){
b[i]=s2[i-1]-'0';
}
for(int i=1;i<=n;i++){
int num=0,temp,pos=1,tot=0,r=m,flag=1,t[105];
for(int j=1;j<=n;j++){
if (j==i) t[j]=(a[j]+1)%2;
else t[j]=a[j];
}
for(int j=n;j>=1;j--){
num=num+t[j]*pos;
pos*=2;
}
temp=num;
while(r>=1){
if(b[r]!=temp%3) tot++;
r--;
temp/=3;
if(tot==2) {
flag=0;
break;
}
}
if(flag == 1){
return cout<<num<<endl,0;
}
}
return 0;
}
3. 小卡和质数
题目
小卡最近迷上了质数,所以他想到了一个和质数有关的问题来考考你。
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
题目描述
小卡有 �(1≤�≤105)T(1≤T≤105) 组询问。每次询问给你两个正整数 �,�(1≤�,�≤109)x,y(1≤x,y≤109)。
小卡想知道,第 �x 个质数和第 �y 个质数是否满足 ��⊕��=1px⊕py=1,即第 �x 个质数和第 �y 个质数的异或值是否是11。
输入格式
第一行一个正整数 �T,表示询问的数量。
接下来 �T 行,每行两个正整数 �,�x,y,表示询问的是第 �x 个质数和第 �y 个质数。
输出格式
�T 行,每行一个字符串Yes
或No
,分别表示两个质数的异或值是 11 或不是 11。
输入输出样例
输入 #1复制
4 1 2 23 145 66 2 1 14
输出 #1复制
Yes No No No
题解
判断条件写上就行
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int t,a,b;
cin>>t;
while(t--){
cin>>a>>b;
if((a==2 && b==1)||(a==1 && b==2)) printf("Yes\n");
else printf("No\n");
}
}