洛谷练习综合一

P1478 陶陶摘苹果(升级版)
题目描述
又是一年秋季时,陶陶家的苹果树结了n个果子。陶陶又跑去摘苹果,这次她有一个a公分的椅子。当他手够不着时,他会站到椅子上再试试。

这次与NOIp2005普及组第一题不同的是:陶陶之前搬凳子,力气只剩下s了。当然,每次摘苹果时都要用一定的力气。陶陶想知道在s<0之前最多能摘到多少个苹果。

现在已知n个苹果到达地上的高度xi,椅子的高度a,陶陶手伸直的最大长度b,陶陶所剩的力气s,陶陶摘一个苹果需要的力气yi,求陶陶最多能摘到多少个苹果。

输入输出格式
输入格式:
第1行:两个数 苹果数n,力气s。

第2行:两个数 椅子的高度a,陶陶手伸直的最大长度b。

第3行~第3+n-1行:每行两个数 苹果高度xi,摘这个苹果需要的力气yi。

输出格式:
只有一个整数,表示陶陶最多能摘到的苹果数。

输入输出样例
输入样例#1:
8 15
20 130
120 3
150 2
110 7
180 1
50 8
200 0
140 3
120 2
输出样例#1:
4
说明
所有数据:n<=5000 a<=50 b<=200 s<=1000

  xi<=280  yi<=100
 
 第一种方法:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n,s;//苹果树n,力气s 
	int a,b;//椅子的高度a,手伸直的最大长度b 
	int xi[5001],yi[5001]; //苹果高度xi,摘这个苹果需要的力气yi
	int c[5000],count=0,k=0;
	
	cin>>n>>s;
	cin>>a>>b;
	for(int i=0;i<n;i++)
	{
		cin>>xi[i]>>yi[i];
		if(xi[i]<=(a+b)){
			c[k++]=yi[i];
		}
	}
	sort(c,c+k);	//c中有k个元素 
	for(int i=0;i<k;i++)
	{	 
		s-=c[i];
		if(s>=0) count++;
		else break;
	}

	cout<<count;
	
	return 0;
}

第二种方法:

#include<bits/stdc++.h>
using namespace std;

struct apple
{
	int xi, yi;//高度,力气
};

int dp[1000+5];//存放每个力气能摘的最大苹果数

int main()
{
	int n, s;//苹果树,力气数
	cin >> n >> s;
	int a, b;//高度:椅子,手伸长
	cin >> a >> b;
	apple ap[5000 + 5];
	for (int i = 0; i < n; i++)
		cin >> ap[i].xi >> ap[i].yi;
	for(int i=0;i<n;i++)
		if(ap[i].xi<=a+b)
			for (int j = s; j >= ap[i].yi; j--)
				dp[j] = max(dp[j], dp[j - ap[i].yi] + 1);
	cout << dp[s] << endl;
	return 0;
}

P1618 三连击(升级版)
题目描述
将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”。

//感谢黄小U饮品完善题意

输入输出格式
输入格式:
三个数,A B C。

输出格式:
若干行,每行3个数字。按照每行第一个数字升序排列。

输入输出样例
输入样例#1:
1 2 3
输出样例#1:
192 384 576
219 438 657
273 546 819
327 654 981
说明
保证A<B<C
第一种方法:

#include <iostream>
#include <algorithm> 
using namespace std;

int main()
{
	int a,b,c,arr[9]={1,2,3,4,5,6,7,8,9};
	int flag=1;
	int A,B,C;
	cin>>A>>B>>C;
	do{
		
		a=arr[0]*100+arr[1]*10+arr[2];
		b=arr[3]*100+arr[4]*10+arr[5];
		c=arr[6]*100+arr[7]*10+arr[8];
		if((A+B+C)*a==(a+b+c)*A&&(A+B+C)*b==(a+b+c)*B&&(A+B+C)*c==(a+b+c)*C)
		{
			flag=0;
			cout<<a<<" "<<b<<" "<<c<<endl;
		}	
		
	}while(next_permutation(arr,arr+9));  //使用全排列,记住一般用do   while结构
	if(flag)
		cout<<"No!!!";
	
	return 0;
}

P1579 哥德巴赫猜想(升级版)
题目背景
1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和。质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是质数,因为6除了约数1和6之外还有约数2和3。需要特别说明的是1不是质数。

这就是哥德巴赫猜想。欧拉在回信中说,他相信这个猜想是正确的,但他不能证明。

从此,这道数学难题引起了几乎所有数学家的注意。哥德巴赫猜想由此成为数学皇冠上一颗可望不可及的“明珠”。

题目描述
现在请你编一个程序验证哥德巴赫猜想。

先给出一个奇数n,要求输出3个质数,这3个质数之和等于输入的奇数。

输入输出格式
输入格式:
仅有一行,包含一个正奇数n,其中9<n<20000

输出格式:
仅有一行,输出3个质数,这3个质数之和等于输入的奇数。相邻两个质数之间用一个空格隔开,最后一个质数后面没有空格。如果表示方法不唯一,请输出第一个质数最小的方案,如果第一个质数最小的方案不唯一,请输出第一个质数最小的同时,第二个质数最小的方案。

输入输出样例
输入样例#1:
2009
输出样例#1:
3 3 2003

#include <iostream>
using namespace std;

//判断素数 
int isprime(int m)
{
	
	if(m==2) return 1;
	for(int i=2;i*i<=m;i++)
		if(m%i==0) return 0;
	return 1;
}

int main()
{
	int n;
	cin>>n;
	int a[20001];//a数组里面放的是所有素数 
	int t=0;
	a[t++]=2;//除了2以外,其他的偶数不可能是素数, 
	//构造素数
	for(int i=3;i<=n;i+=2)
		if(isprime(i)) 
			a[t++]=i; 
	
	for(int i=0;a[i]>0;i++)
		for(int j=0;a[j]>0;j++)
			for(int k=0;a[k]>0;k++)
				if(a[i]+a[j]+a[k]==n)
				{
					cout<<a[i]<<" "<<a[j]<<" "<<a[k];
					return 0;
				}
	
	return 0;	
} 

P2089 烤鸡
题目背景
猪猪hanke得到了一只鸡

题目描述
猪猪Hanke特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke吃鸡很特别,为什么特别呢?因为他有10种配料(芥末、孜然等),每种配料可以放1—3克,任意烤鸡的美味程度为所有配料质量之和

现在,Hanke想要知道,如果给你一个美味程度,请输出这10种配料的所有搭配方案

输入输出格式
输入格式:
一行,n<=5000

输出格式:
第一行,方案总数

第二行至结束,10个数,表示每种配料所放的质量

按字典序排列。

如果没有符合要求的方法,就只要在第一行输出一个“0”

输入输出样例
在这里插入图片描述

#include<iostream>
using namespace std;

int n;		//美味程度
int all_solution[10000][10];	//记录所有方案
int solution[10];			//记录方案
int kind=0;					//记录种类
void solve(int total,int a)
{
	if (a == 10)
	{
		if (total == n)
		{
			for (int i = 0; i < 10; i++)
				all_solution[kind][i] = solution[i];
			kind++;
		}
	}
	else if (total >= n)
		return ;
	else
		for (int i = 1; i <= 3; i++)
		{
			solution[a] = i;
			solve(total + i, a + 1);
		}

}

int main()
{
	cin >> n;
	if (n < 10 || n>30)
		cout << 0 << endl;
	else
	{
		solve(0, 0);
		cout << kind << endl;
		for (int i = 0; i < kind; i++)
		{
			for (int j = 0; j < 9; j++)
				cout << all_solution[i][j] << ' ';
			cout << all_solution[i][9] << endl;
		}
	}


	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43090158/article/details/94713715