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;
}