XYNU—ACM暑假集训第三次测试 贪心算法
来源:互联网 发布:魔兽 红龙女王被 知乎 编辑:程序博客网 时间:2024/05/18 11:40
问题 A: 灯光控制
时间限制: 1 Sec 内存限制: 128 MB提交: 53 解决: 40
[提交][状态][讨论版][Edit] [TestData]
题目描述
灯光师小明控制着各种晚会的各种大小灯,每次晚会小明都会对灯进行很多次操作。对每盏灯只能进行两种操作,开和关。现在小明希望自己随时都知道还有多少盏灯亮着。你需要编写一个程序当小明问你时你能快速的说出还有多少盏灯亮着。 注意晚会开始时所有的灯都是灭的。
输入
只有一组数据.第一行输入两个正整数N,T(0<N<=100000,0<T<=1000000)N表示有N盏灯,T表示有T条指令。随后T行每行有一条指令,这条指令包含一个字符串,当字符串为CHANGE,它后面还有一个整数m,表示对第m盏灯进行一次操作(操作表示如果第m盏灯灯是开着时就关闭,如果灯是关着时就打开)。当字符串为QUERY,表示小明想查询现在还有多少盏灯亮着。
输出
每次查询指令输出占一行,输出当前亮着灯的个数
样例输入
10 8
CHANGE 1
QUERY
CHANGE 2
QUERY
CHANGE 1
CHANGE 9
CHANGE 7
QUERY
样例输出
1
2
3
提示
显然灯的序号是从1开始的。
#include<stdio.h>int main(){int n, t, m, count = 0, a[100005] = {0};char s[20];scanf("%d%d", &n, &t);for(int i = 0; i < t; i++) {scanf("%s", s);if(s[0] == 'C'){scanf("%d", &m);a[m] = !a[m];if(a[m]) count++;else count--;}if(s[0] == 'Q')printf("%d\n", count);}}
1781: 彩灯统计
时间限制: 1 Sec 内存限制: 128 MB提交: 43 解决: 21
[提交][状态][讨论版][Edit] [TestData]
题目描述
输入
第一行输入彩灯的数量N(1<= N <= 1000),接下来的N行输入N个字符串表示彩灯的颜色(字符串的长度不超过10,字符串全为小写字母,并且只有一组测试数据)。保证彩灯颜色不超过1000种。
输出
输出这些彩灯中最多的颜色的名字与数量,并用空格隔开(数据保证最多的颜色只有一个)。
样例输入
12
red
green
blue
white
red
green
blue
white
red
green
blue
red
样例输出
red 4
#include<stdio.h>#include<string.h>int main(){int n;char a[1010][10];int b[1010]={0};char c[10];scanf("%d",&n);int m=1,i;int d=n;scanf("%s",a[0]);n--;b[0]++;while(n--){scanf("%s",c);for(i=0;i<m;i++){if(!strcmp(c,a[i])){b[i]++;break;}}if(i==m){ strcpy(a[i],c); b[i]++; m++;}}int max=0;for(i=1;i<d;i++){if(b[max]<b[i]) max=i;}printf("%s %d\n",a[max],b[max]);return 0;}
1776: 背包问题X
时间限制: 3 Sec 内存限制: 128 MB提交: 143 解决: 36
[提交][状态][讨论版][Edit] [TestData]
题目描述
现在有很多物品(它们是可以分割的),我们知道它们每个物品的总价值v和重量w(1<=v,w<=100;如果给你一个背包它能容纳的重量为m(10<=m<=100),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大。
输入
随后有n测试数据,每组测试数据的第一行有两个正整数s,m(1<=s<=10);s表示有s个物品。接下来的s行每行有两个正整数v,w。
输出
输出每组测试数据中背包内的物品的价值和,每次输出占一行。
样例输入
1
3 15
50 10
16 82
7 9
样例输出
65
#include<stdio.h>#include<algorithm>using namespace std; struct goods{double V;double W; }good[15];int cmp(goods a,goods b){return a.V/a.W > b.V/b.W; } int main(){int n;scanf("%d",&n);while(n--){double m;int s;scanf("%d%lf",&s,&m);for(int i = 0; i < s; i++) {scanf("%lf%lf",&good[i].V,&good[i].W);}sort(good,good+s,cmp);double count = 0.0;for(int i = 0; i < s; i++){if(m > good[i].W){m -= good[i].W;count += good[i].V;//printf("%lf\n",count);}else{count += m*good[i].V/good[i].W;//printf("%lf\n",count);break;}}printf("%.0lf\n",count);}return 0; }
1778: 买饼干
时间限制: 1 Sec 内存限制: 128 MB提交: 110 解决: 42
[提交][状态][讨论版][Edit] [TestData]
题目描述
小明同学决定去鼎盛超市买点零食囤着慢慢吃。现在假设小明带着一定数量的现金要去超市采购饼干(散装)。如果超市有m种饼干,各种饼干的单价和重量已知,请问,为了满足更多饼干的需求(因为各种饼干味道差不多,当然是买的越多越好啊),最多能购买多少重量的饼干呢?
输入
输出
对于每组测试数据,请输出能够购买饼干的最多重量.(你可以假设现金买不光超市所有的饼干)。
每个实例的输出占一行,保留2位小数。
样例输入
1
7 2
3 3
4 4
样例输出
2.33
#include<stdio.h>#include<algorithm>using namespace std;struct cookies{double p; //单价 double h; //重量 }cook[1005];int cmp(cookies a,cookies b){return a.p < b.p;}int main(){int C;scanf("%d",&C);while(C--){double n;int m;scanf("%lf%d",&n,&m);for(int i = 0; i < m; i++){scanf("%lf%lf",&cook[i].p,&cook[i].h);}sort(cook,cook+m,cmp);double count=0.0;for(int i = 0; i < m; i++){if(n > cook[i].h * cook[i].p){n = n - cook[i].h * cook[i].p;count += cook[i].h;}else{count += n / cook[i].p;break;}}printf("%.2lf\n",count);}}
1783: 魔法扫帚
时间限制: 1 Sec 内存限制: 128 MB提交: 34 解决: 23
[提交][状态][讨论版][Edit] [TestData]
题目描述
输入
在一个测试用例中,第一行包含一个正号N表示魔法师的数量(0≤N≤3000)
下面N行:每行只有一个非负整数,表示每个士兵的等级数。等级范围为0~30;
输出
对于每一个测试样例,输出需要扫帚数量的最小值。
样例输入
4
10
20
30
4
5
2
3
4
3
4
样例输出
1
2
#include<stdio.h>int main(){int N;while(scanf("%d",&N)!=EOF){int m,b[3005]={0},mark=0;for(int i = 0; i < N; i++){scanf("%d",&m);b[m]++;if(b[m] > mark){mark = b[m];} }printf("%d\n",mark);}return 0;}
1782: 火柴字
时间限制: 1 Sec 内存限制: 128 MB提交: 52 解决: 16
[提交][状态][讨论版][Edit] [TestData]
题目描述
小明得到了一盒火柴,他可以用这些火柴拼成各种数字。假设现有V根火柴,根据拼法的不同,拼成数字i 需要ai根火柴。
请你帮助他拼成最大的数字。
输入
每一种情况下,第一行都包含一个非负整数V(0 ≤V ≤106)。
第二行包含九个正整数a1,a2,……,a9(1≤ai≤105)。
输出
样例输入
55 4 3 2 1 2 3 4 529 11 1 12 5 8 9 10 6
样例输出
5555533
#include <stdio.h>int main(){int v,i;int a[11];while(scanf("%d",&v)!=EOF){int min,mark,count,M;scanf("%d",&a[1]);mark=1;min=a[1];for(i=2;i<=9;i++){scanf("%d",&a[i]);if(a[i]<=min)min=a[i],mark=i;}if(v<min) {printf("-1\n");continue;}count=v/min;M=v%min;while(M>0){for(i=9;i>mark;i--)if(a[i]-min<=M){printf("%d",i);count--;M-=a[i]-min;break;}if(i==mark) break;}for(i=1;i<=count;i++)printf("%d",mark);printf("\n");}return 0;}
1780: 火力覆盖
时间限制: 1 Sec 内存限制: 128 MB提交: 27 解决: 16
[提交][状态][讨论版][Edit] [TestData]
题目描述
输入
每一组测试数据的第一行有三个整数n,w,h,n表示共有n个目标打击点,w表示目标区域的横向长度,h表示目标区域的纵向长度。
随后的n行,都有两个整数xi和ri,xi表示第i个目标打击点的的横坐标(最左边为0),ri表示该目标打击点能火力覆盖的圆的半径
输出
如果不存在一种能够把整个目标区域火力覆盖的方案,请输出0。
样例输入
22 8 61 14 52 10 64 56 5
样例输出
12
#include <stdio.h> #include <math.h> #include <algorithm> using namespace std; struct node{ double le, ri; }s[1005]; int cmp(node a, node b) { return a.le < b.le; } int main() { int n, t; double w, h; scanf("%d", &t); while(t --){ scanf("%d%lf%lf", &n, &w, &h); h /= 2; int i, j; double temp, r; for(i = 0, j = 0; i < n; i ++){ scanf("%lf%lf", &temp, &r); if(r <= h) continue; else{ double temp1 = sqrt(r*r-h*h); s[j].le = temp -temp1; s[j++].ri = temp+temp1; } } sort(s, s+j, cmp); if(s[0].le > 0) {printf("0\n"); continue;} double end = 0; i = 0; int cou = 0; while(end <= w&&i < j&&cou <= n){ temp = end; while(s[i].le <= end&&i <j ){ if(s[i].ri > temp) temp = s[i].ri; i++; } end = temp+0.000001;//每次都只加上0.00001,俩区间有断点,就能区分 ++cou; } if(end < w||cou > n){ printf("0\n"); } else{ printf("%d\n", cou); } } return 0; }
1777: 搬木头的熊二
时间限制: 1 Sec 内存限制: 128 MB提交: 35 解决: 16
[提交][状态][讨论版][Edit] [TestData]
题目描述
东北原始森林经历了风暴袭击,光头强的房子被摧毁了。正好森林有被风暴摧毁而散落的木头,熊大和熊二决定帮可怜的光头强修一座新房子。熊大负责把散落的木头收集成堆,熊二负责搬木头。熊二决定把所有的木头合成一堆。 因为熊二比较懒,为了省力气,熊二开始想点子了:
每一次合并,熊二可以把两堆木头合并到一起,消耗的体力等于两堆木头的重量之和。可以看出,所有的木头经过n-1次合并之后,就只剩下一堆了。熊二在合并木头时总共消耗的体力等于每次合并所耗体力之和。
因为还要花大力气把这些木头搬走,所以熊二在合并木头时要尽可能地节省体力。假定每根木头重量都为1,并且已知木头的堆数和每堆木头的数目,你的任务是设计出合并的次序方案,使熊二耗费的体力最少,并输出这个最小的体力耗费值。
例如有3堆木头,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以熊二总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。
输入
第一行输入整数N(0<N<=10)表示测试数据组数。接下来每组测试数据输入包括两行,第一行是一个整数n(1<=n<=12000),表示木头的堆数。第二行包含n个整数,用空格分隔,第i个整数ai(1<=ai<=20000)是第i堆木头的数目。
输出
每组测试数据输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。
样例输入
1
3
1 2 9
样例输出
15
#include<stdio.h>#include<algorithm>using namespace std;int main(){ int N; scanf("%d",&N); while(N--) { int n; long long a[12005],b = 0; scanf("%d\n",&n); for(int i = 0; i < n; i++) { scanf("%lld",&a[i]); } sort(a,a+n); for(int i = 1; i < n; i++) { sort(a,a+n); a[i] = a[i]+a[i-1]; b += a[i] ; } printf("%lld\n",b); }}
- XYNU—ACM暑假集训第三次测试 贪心算法
- XYNU—ACM暑假集训第一次测试
- XYNU—ACM暑假集训第二次测试
- XYNU—ACM暑假集训第四次测试 STL
- ACM 第三次测验 关于贪心算法
- ACM暑假集训(0)
- ACM暑假集训方法
- XYNU 1248 排队打水问题(water)—贪心算法
- ACM 学习心得 ——2014年ACM暑假集训有感
- ACM暑假集训训练场
- acm暑假集训已经过半...
- ACM暑假留校集训总结
- 2016ACM暑假集训 - Sticks
- 2016ACM暑假集训总结
- 暑假ACM集训报告总结
- 2017ACM暑假集训感悟
- 2017ACM暑假集训总结
- 暑假集训——贪心专题——F题
- NIO
- Android Studio 任务管理器功能思路和代码(一)
- Java中Static、final关键字
- SocketServer模块解析
- 数据结构小结——链式栈
- XYNU—ACM暑假集训第三次测试 贪心算法
- 使用jax-ws开发webservice(二)
- 51Nod-1175-区间中第K大的数
- Effective Java
- 使用ffmpeg将实时流保存为AVI
- Java进阶04 RTTI
- HashMap实现原理分析
- 阿里云服务器+wdcp面板+wordpress搭建个人博客
- 笔记8:二叉树