week 12

目录

1.宝物筛选

题目

输入格式

输出格式

输入输出样例

题解

代码

2.尴尬的数字

题目

题目描述

输入格式

输出格式

输入输出样例

题解

代码

3. 小卡和质数

题目

题目描述

输入格式

输出格式

输入输出样例

题解

代码


 

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 行,每行一个字符串YesNo,分别表示两个质数的异或值是 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");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值