买文具的奇葩解法

大家好,我是大白

在做题之前,我先给大家一个礼物

礼物

我发现有一些题很好笑,就是他让谁谁谁去买东西或者干什么事,但是却要让我们来解决这个问题

所以呢,今天这道题,就是小明去买文具(P6188)

小明的班上共有 nn 元班费,同学们准备使用班费集体购买 33 种物品:

  1. 圆规,每个 77 元。
  2. 笔,每支 44 元。
  3. 笔记本,每本 33 元。

小明负责订购文具,设圆规,笔,笔记本的订购数量分别为 a,b,ca,b,c,他订购的原则依次如下:

  1. nn 元钱必须正好用光,即 7a+4b+3c=n7a+4b+3c=n。
  2. 在满足以上条件情况下,成套的数量尽可能大,即 a,b,ca,b,c 中的最小值尽可能大。
  3. 在满足以上条件情况下,物品的总数尽可能大,即 a+b+ca+b+c 尽可能大。

请你帮助小明求出满足条件的最优方案。可以证明若存在方案,则最优方案唯一。

输入格式

输入仅一行一个整数,代表班费数量 nn。

输出格式

如果问题无解,请输出 -1−1。

否则输出一行三个用空格隔开的整数 a, b, ca,b,c,分别代表圆规、笔、笔记本的个数。

输入输出样例

输入 #1

1

输出 #1

-1

输入 #2

14

输出 #2

1 1 1

输入 #3

33

输出 #3

1 2 6

说明/提示

样例输入输出 3 解释

a=2,b=4,c=1a=2,b=4,c=1 也是满足条件 1,21,2 的方案,但对于条件 33,该方案只买了 77 个物品,不如 a=1,b=2,c=6a=1,b=2,c=6 的方案。

好了,其实这道题有很多思路,像是我刚开始想要三重循环:

#include<bits/stdc++.h>
using namespace std;
int n;
int a,b,c;
int minmax_=0;
int summax_=0;
int ans[3]={-1,-1,-1};
int main(){
	cin>>n;
	if(n==0){
		cout<<0<<" "<<0<<" "<<0;
		return 0;
	}
	for(a=0;a<n;a++){
		for(b=0;b<n;b++){
			for(c=0;c<n;c++){
				if(7*a+b*4+c*3==n){
					int d=a<b?(a<c?a:c):(b<c?b:c);
					int sum=a+b+c;
					if(sum>summax_){
						summax_=sum;
						ans[0]=a;
						ans[1]=b;
						ans[2]=c;
					}
					if(minmax_<d){
						minmax_=d;
						ans[0]=a;
						ans[1]=b;
						ans[2]=c;
					}
				}
			}
		}
	}
	if(ans[0]==-1){
		cout<<-1;
		return 0;
	}
	cout<<ans[0]<<" "<<ans[1]<<" "<<ans[2];
	return 0;
} 

结果很棒!

那当然改进一下,但是又发现改进完也就是少了一个TLE;

所以我想到了一个暴力好用的办法!

我们可以找规律:

#include<bits/stdc++.h>
using namespace std;
int n;
int a,b,c;
int ans[14][3]={
	0,0,0,
	-1,-1,4,
	-1,0,3,
	0,0,1,
	0,1,0,
	-1,0,4,
	0,0,2,
	0,1,1,
	0,2,0,
	0,0,3,
	0,1,2,
	0,2,1,
	0,0,4,
	0,1,3
};
int main(){
	cin>>n;
	if(n==0){
		cout<<0<<" "<<0<<" "<<0;
		return 0;
	}
	if(n==1||n==2||n==5){
		cout<<-1;
		return 0;
	}
	int ans_=n/14;
	int m=n%14;
	cout<<ans_+ans[m][0]<<" "<<ans_+ans[m][1]<<" "<<ans_+ans[m][2];
	return 0;
} 

就是用套数加上规律,就AC了!

记得关注、收藏、点赞!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会为您介绍如何使用Python和Neo4j来实现知识图谱购文具的功能。 首先,您需要安装Neo4j Python驱动程序。您可以使用以下命令在命令行中安装它: ``` pip install neo4j ``` 接下来,您需要创建一个Neo4j数据库并设置好节点和关系。在这个例子中,我们可以创建三种节点:`Product`(产品)、`Supplier`(供应商)和`Customer`(客户),以及两种关系:`SUPPLIES`(供应)和`PURCHASED_BY`(购)。 以下是创建这些节点和关系的Cypher查询示例: ``` CREATE (:Product {name: '笔记本', price: 10.0, stock: 100}) CREATE (:Product {name: '钢笔', price: 5.0, stock: 200}) CREATE (:Product {name: '铅笔', price: 1.0, stock: 500}) CREATE (:Supplier {name: '供应商A', address: '上海市'}) CREATE (:Supplier {name: '供应商B', address: '北京市'}) CREATE (:Customer {name: '客户A', address: '广州市'}) CREATE (:Customer {name: '客户B', address: '深圳市'}) MATCH (p:Product {name: '笔记本'}), (s:Supplier {name: '供应商A'}) CREATE (s)-[:SUPPLIES]->(p) MATCH (p:Product {name: '钢笔'}), (s:Supplier {name: '供应商B'}) CREATE (s)-[:SUPPLIES]->(p) MATCH (p:Product {name: '笔记本'}), (c:Customer {name: '客户A'}) CREATE (c)-[:PURCHASED_BY]->(p) MATCH (p:Product {name: '钢笔'}), (c:Customer {name: '客户B'}) CREATE (c)-[:PURCHASED_BY]->(p) MATCH (p:Product {name: '铅笔'}), (c:Customer {name: '客户A'}) CREATE (c)-[:PURCHASED_BY]->(p) ``` 接下来,您可以使用Python编写代码,以查询Neo4j数据库并实现购文具的功能。以下是一个示例程序: ```python from neo4j import GraphDatabase, basic_auth uri = "bolt://localhost:7687" driver = GraphDatabase.driver(uri, auth=basic_auth("neo4j", "password")) def buy_product(product_name, customer_name): with driver.session() as session: result = session.run("MATCH (p:Product {name: $product_name})<-[:SUPPLIES]-(s:Supplier) " "MATCH (c:Customer {name: $customer_name}) " "MERGE (c)-[:PURCHASED_BY]->(p) " "SET p.stock = p.stock - 1 " "RETURN p.price", product_name=product_name, customer_name=customer_name) price = result.single()[0] print("成功购产品%s,价格为%.2f元。" % (product_name, price)) buy_product("笔记本", "客户A") ``` 在此示例中,`buy_product`函数接受产品名称和客户名称作为参数,并在Neo4j数据库中查询该产品的供应商,然后将该产品的购关系与客户节点合并。最后,该函数还将产品库存减少1,并返回产品价格。您可以根据需要修改此示例,以适应您的特定需求。 希望这可以帮助您实现知识图谱购文具的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值