问题 A: 最少硬币
[命题人 : admin]
时间限制 : 1.000 sec 内存限制 : 128 MB
提交问题列表
题目描述
假设有4种硬币,它们的面值分别为1分、5分、10分和25分。
现在要找给顾客n分钱。
请问怎样找零钱才能使给顾客的硬币个数最少?
输出所需最少硬币的枚数。
输入
输入需要找给顾客的零钱n(单位:分)。
输出
输出所需最少硬币的枚数。
样例输入 Copy
8 10 63
样例输出 Copy
4 1 6
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int t[4] = {1,5,10,25};
int a[N];
void solve(){
for(int i = 1;i < N;i++){
a[i] = 0x7fffffff;
}
a[0] = 0;
for(int i = 0;i < 4;i++){
for(int j = t[i];j <= N;j++){
a[j] = min(a[j],a[j - t[i]] + 1);
}
}
}
int main(){
int n;
solve();
while(cin >> n){
cout << a[n] << endl;
}
return 0;
}
问题 B: X星纸币
[命题人 : admin]
时间限制 : 1.000 sec 内存限制 : 128 MB
提交问题列表
题目描述
X星最新版纸币的面额很奇怪,一共有1元、4元、9元、16元、25元、100元六种不同的面额。
已知每种面额纸币的数量不限,现在需要从中选取若干张纸币组成N元(N为正整数)。
请编写一个程序计算组成N元最少需要的纸币数量。
输入
单组输入。
每组1行,包含一个正整数N,N<=10^6。
输出
输出组成N元最少需要的纸币数量。
样例输入 Copy
12
样例输出 Copy
3
提示
组成12元最少需要3张面值都是4的纸币。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int a[6] = {1,4,9,16,25,100};
int dp[7][N];
void solve(int n){
for(int i = 1;i <= 6;i++)dp[i][0] = 0;
for(int i = 0;i <= n;i++)dp[0][i] = 0x3f3f3f3f;
for(int i = 1;i <= 6;i++){
for(int j = 1;j <= n;j++){
if(j < a[i - 1]){
dp[i][j] = dp[i - 1][j];
continue;
}
dp[i][j] = min(dp[i][j - a[i - 1]] + 1,dp[i - 1][j]);
}
}
cout << dp[6][n] << endl;
}
int main(){
int n;
cin >> n;
solve(n);
return 0;
}
问题 C: 图书排序
[命题人 : 201501010119]
时间限制 : 1.000 sec 内存限制 : 128 MB
提交问题列表
题目描述
某图书销售管理系统需要对图书(Book)进行排序,每一本图书包含书名(bookName)、销量(bookSales)、价格(bookPrice)等属性,要求先按照销量由大到小排序,对于销量相同的图书再按照价格由小到大排序。
输入
每组输入包括两个部分,第一部分为书的数量n,
接下来n行则为n本书的信息。 按顺序输入书名(不超过20个字)、销量、价格。
输出
输出排序后的信息,每个属性用空格隔开
样例输入 Copy
7 C++程序设计 120 25.00 软件工程 96 48.00 高等数学 80 32.50 算法分析与设计 96 54.00 离散数学 96 28.00 计算机网络 96 36.00 操作系统 115 45.00
样例输出 Copy
C++程序设计 120 25.00 操作系统 115 45.00 离散数学 96 28.00 计算机网络 96 36.00 软件工程 96 48.00 算法分析与设计 96 54.00 高等数学 80 32.50
#include<bits/stdc++.h>
using namespace std;
struct m{
string book;
double v;
int s;
}a[100000];
bool cmp(m x,m y){
if(x.s == y.s)return x.v < y.v;
else return x.s > y.s;
}
int main(){
int n;
while(cin >> n){
for(int i = 1;i <= n;i++)cin >> a[i].book >> a[i].s >> a[i].v;
sort(a + 1,a + 1 + n,cmp);
for(int i = 1;i <= n;i++)cout << a[i].book << " " << a[i].s << " " << fixed << setprecision(2) << a[i].v << endl;
}
return 0;
}
问题 D: 月饼
[命题人 : admin]
时间限制 : 1.000 sec 内存限制 : 128 MB
提交问题列表
题目描述
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,其库存量分别为18、15、10万吨,总售价分别为75、72、45亿元。如果市场的最大需求量只有20万吨,那么我们最大收益策略应该是卖出全部15万吨第2种月饼、以及5万吨第3种月饼,获得 72 + 45/2 = 94.5(亿元)。
输入
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N表示月饼的种类数、以及不超过500(以万吨为单位)的正整数D表示市场最大需求量。随后一行给出N个正实数表示每种月饼的库存量(以万吨为单位);最后一行给出N个正实数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。
输出
对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后2位。(四舍五入)
样例输入 Copy
3 20 18 15 10 75 72 45
样例输出 Copy
94.50
#include<bits/stdc++.h>
#define MAXN 1000
using namespace std;
struct Goods {
int number;
double w;
double v;
double p;
}goods[MAXN];
bool comp(Goods a, Goods b)
{
return a.p >= b.p;
}
void f(int n)
{
int i;
for (i = 1; i <= n; i++)
cin >> goods[i].w;
for (i = 1; i <= n; i++)
cin >> goods[i].v;
for (i = 1; i <= n; i++)
goods[i].p = goods[i].v / goods[i].w;
}
void bag(int n, double count)
{
int i;
double totalValue = 0;
for (i = 1; i <= n; i++)
{
if (count >= goods[i].w)
{
totalValue += goods[i].v;
count -= goods[i].w;
}
else
{
totalValue+=goods[i].p*count;
break;
}
}
printf("%.2f", totalValue);
}
int main()
{
int n,count;
cin >> n;
cin >> count;
f(n);
sort(goods+1,goods+n+1,comp);
bag(n,count);
return 0;
}
问题 E: 汽车加油问题
[命题人 : 201501010119]
时间限制 : 1.000 sec 内存限制 : 128 MB
提交问题列表
题目描述
一辆汽车加满油后可以行驶n千米。旅途中有k个加油站。若要使沿途的加油次数最少,请设计一个有效的算法。
输入
第一行有2个正整数n和k,表示汽车加满油后可行驶nkm,且旅途中有k个加油站。接下来1行中,有k+1个整数,表示第k个加油站与第k-1个加油站之间的距离。第0个加油站表示出发地,汽车已加满油,且在第0个加油站满油不算加油,第k+1个加油站表示目的地。(请处理到文件尾)
输出
最少加油次数。如果无法到达目的地,则输出“No Solution”。
样例输入 Copy
7 7 1 2 3 4 5 1 6 6
样例输出 Copy
4
#include<bits/stdc++.h> using namespace std; int a[1000000]; void solve(int a[],int n,int k){ for(int i = 0;i < k;i++){ if(a[i] > n){ cout << "No Solution" << endl; return; } } int ans = 0; int sum = 0; for(int i = 0;i < k + 1;i++){ ans += a[i]; if(ans > n){ sum++; ans = a[i]; } } cout << sum << endl; } int main(){ int n,k; while(cin >> n >> k){ for(int i = 0;i < k + 1;i++)cin >> a[i]; solve(a,n,k); } return 0; }
问题 F: 最大收益
[命题人 : admin]
时间限制 : 1.000 sec 内存限制 : 128 MB
提交问题列表
题目描述
小X是一位精明的投资人,他每次都能够做出正确的投资判断。现在有N个项目,每个项目的总投资额和总收益已知,并且每一个项目都允许小X投资一部分,当然也就只能拿到一部分收益。
现在小X决定拿出M万元钱来进行投资,请你帮他设计一个算法来计算最大收益和。
输入
对于每一个样例,第1行包含两个正整数,分别是M和N,其中M<=10^6,N<=100。
第2行一共有2*N个整数(不一定是正整数),奇数位置(即2*N-1位置)的数字表示第N个项目的总投资额(万元),偶数位置(即2*N位置)的数字表示第N个项目的总收益(万元),两个数字之间用空格隔开。
输出
小X可以获得的最大收益和(万元,结果保留两位小数)。
样例输入 Copy
100 4 50 10 20 10 40 10 50 20
样例输出 Copy
37.50
#include<bits/stdc++.h>
using namespace std;
struct m{
double v,s,p;
}a[100000];
bool cmp(m a,m b){
return a.p >= b.p;
}
int main(){
int m,n;
while(cin >> m >> n){
for(int i = 1;i <= n;i++)cin >> a[i].v >> a[i].s,a[i].p = a[i].s / a[i].v;
sort(a + 1, a + 1 + n,cmp);
double ans = 0;
for(int i = 1;i <= n;i++){
if(m >= a[i].v){
ans += a[i].s;
m -= a[i].v;
}
else {
ans += a[i].p * m;
break;
}
}
cout << fixed << setprecision(2) << ans << endl;
}
return 0;
}
问题 G: 组个最小数
[命题人 : admin]
时间限制 : 1.000 sec 内存限制 : 128 MB
提交问题列表
题目描述
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如: 给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。 现给定数字,请编写程序输出能够组成的最小的数。
输入
每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。 10个数字的总个数不超过200,且至少拥有1个非0的数字。
输出
在一行中输出能够组成的最小的数。
样例输入 Copy
2 2 0 0 0 3 0 0 1 0
样例输出 Copy
10015558
#include<bits/stdc++.h>
using namespace std;
int a[10];
int main(){
for(int i = 0;i < 10;i++)cin >> a[i];
for(int i = 1;i < 10;i++){
if(a[i] != 0){
cout << i;
a[i]--;
break;
}
}
for(int i = 0;i < 10;i++){
if(a[i] != 0){
while(a[i]--)cout << i;
}
}
return 0;
}
问题 H: 最后一滴血
[命题人 : 外部导入]
时间限制 : 1.000 sec 内存限制 : 128 MB
提交问题列表
题目描述
在ACM/ICPC这样的程序设计竞赛中,最早解出一道题称为抢到FB(First Blood,第一滴血)。现在ACM/ICPC世界总决赛甚至为每道题的FB设立了特别奖。
也许我们还可以设一个LB(Last Blood,最后一滴血)奖,奖给最后一个解出某题的队伍。注意:你不能先提交程序,得到Yes之后等比赛快结束时把它再交一遍,因为一旦一只队伍解出了某题,它对该题的所有后续提交都会被忽略。所有有本事的话,应该是写完程序以后先不交,等到比赛快结束时才交。当然,这样做浪费了很多罚时并且还有WA的风险,所以LB奖才显得有趣。
输入一场比赛中所有提交和对应的结果,输出每道题的LB奖得主。
输入
输入仅包含一组数据。第一行为题数n、队伍数t和提交数m(5<=n<=12, 10<=t<=100, 1<=m<=1000)。以下m行每行包含time(0~300之间的整数,单位:分钟), teamID(1~t), problem(A~L)和结果(Yes或者No)。提交按照时间从小到大排序,所以即使两个提交的time相同,也有先后顺序(可能只差几秒钟)。任意两个提交的顺序都不会绝对相同,因此LB奖要么空缺,要么有惟一的得主。
输出
对于每组数据,输出每道题目的LB奖得主的提交时间和teamID,格式见样例。
样例输入 Copy
5 10 18 0 2 B No 11 2 B Yes 20 3 A Yes 35 8 E No 40 8 E No 45 7 E No 50 10 A Yes 100 4 A No 120 6 B Yes 160 2 E Yes 180 2 A Yes 210 3 B Yes 240 10 B No 250 10 B Yes 270 2 B Yes 295 8 E Yes 295 7 E Yes 299 10 D Yes
样例输出 Copy
A 180 2 B 250 10 C - - D 299 10 E 295 7
#include<bits/stdc++.h>
using namespace std;
int dp[1000][1000];
struct m{
int a,b;
char ch;
}s[100000];
int main(){
int n,t,m;
while(cin >> n >> t >> m){
memset(dp,0,sizeof(dp));
int a1,b1;
char c1,s1[210];
int ans = 0;
for(int i = 0;i < m;i++){
cin >> a1 >> b1 >> c1 >> s1;
getchar();
if(s1[0] == 'Y'){
if(dp[b1][c1 - 'A'] != 1){
s[ans].a = a1;
s[ans].b = b1;
s[ans].ch = c1;
dp[b1][c1 - 'A'] = 1;
ans++;
}
}
}
int res,sum = 0;
for(int i = 0;i < n;i++){
res = 0;
sum = 1;
for(int j = 0;j < ans;j++){
if(s[j].ch - 'A' == i){
if(sum <= s[j].a){
sum = s[j].a;
res = s[j].b;
}
}
}
if(sum == 1){
printf("%c - -\n",'A' + i);
}else {
printf("%c %d %d\n",'A' + i,sum,res);
}
}
}
return 0;
}