显然灯的序号是从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);
- }
- }
问题B: 彩灯统计
时间限制: 1 Sec 内存限制: 128 MB
题目描述
儿童乐园有各种颜色的彩灯,小明想要知道哪种颜色的灯数量最多。但是由于数据过于庞大,小明也束手无策,所以他想请聪明如你的ACMer来帮忙。
输入
第一行输入彩灯的数量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;
- }
问题C: 背包问题
时间限制: 3 Sec 内存限制: 128 MB
题目描述
现在有很多物品(它们是可以分割的),我们知道它们每个物品的总价值v和重量w(1<=v,w<=100;如果给你一个背包它能容纳的重量为m(10<=m<=100),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大。
输入
第一行输入一个正整数n(1<=n<=5),表示有n组测试数据;
随后有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;
-
-
- }else{
- count += m*good[i].V/good[i].W;
-
- break;
- }
- }
- printf("%.0lf\n",count);
- }
- return 0;
- }
问题D: 买饼干
时间限制: 1 Sec 内存限制: 128 MB
题目描述
小明同学决定去鼎盛超市买点零食囤着慢慢吃。现在假设小明带着一定数量的现金要去超市采购饼干(散装)。如果超市有m种饼干,各种饼干的单价和重量已知,请问,为了满足更多饼干的需求(因为各种饼干味道差不多,当然是买的越多越好啊),最多能购买多少重量的饼干呢?
输入
输入数据首先包含一个正整数C,表示有C组测试用例,每组测试用例的第一行是两个整数n和m(0<n<=1000,0<m<=1000),分别表示现金的金额和饼干的种类,然后是m行数据,每行包含2个整数p和h(1<=p<=25,1<=h<=100),分别表示单价和对应饼干的重量。
输出
对于每组测试数据,请输出能够购买饼干的最多重量.(你可以假设现金买不光超市所有的饼干)。
每个实例的输出占一行,保留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);
- }
- }
问题E: 魔法扫帚
时间限制: 1 Sec 内存限制: 128 MB
题目描述
魔法师工会为了让每一位魔法师学会飞行,决定从邓布利多校长那里买一批扫帚。我们假设一个魔法师有一个等级的数字来表示他的飞行技术。只有有较高水平的魔法师可以教水平较低的人,也就是说,前者的级别大于后者。一个魔法师最多只能有一个老师,当然,没有老师也是合法的。同样的,一个魔法师最多只能有一个学生,而没有学生也是可能的。老师可以教他的学生用同样的扫帚。当然,所有的魔法师在学会飞行前都必须在扫帚柄上练习。魔法扫帚很贵!那么,你能帮助魔法师公会计算最少需要多少把扫帚吗?
输入
输入文件包含多个测试用例。
在一个测试用例中,第一行包含一个正号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;
- }
问题F: 火柴字
时间限制: 1 Sec 内存限制: 128 MB
题目描述
小明得到了一盒火柴,他可以用这些火柴拼成各种数字。假设现有V根火柴,根据拼法的不同,拼成数字i 需要ai根火柴。
请你帮助他拼成最大的数字。
输入
有多个测试用例。
每一种情况下,第一行都包含一个非负整数V(0 ≤V ≤106)。
第二行包含九个正整数a1,a2,……,a9(1≤ai≤105)。
输出
打印出小明可以拼成的最大数字。如果他连拼成一个数字的火柴数量都不够,输出-1。
样例输入
5
5 4 3 2 1 2 3 4 5
2
9 11 1 12 5 8 9 10 6
样例输出
55555
33
- #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;
- }
问题G: 火力覆盖
时间限制: 1 Sec 内存限制: 128 MB
题目描述
朱日和基地某次演习中,蓝军某火炮部队奉命对某长方形目标区域进行饱和打击。目标区域横向长w,纵向长h,军用卫星在它的横向中心线上不同位置处标记有n(n<=10000)个目标打击点,每个打击点i有对应不同型号的火炮负责打击,打击效果是让以打击点为中心半径为Ri的圆被火力覆盖。请选择尽量少的目标打击点,使整块目标区域被火力覆盖。
输入
第一行输入一个正整数N表示共有n次测试数据。
每一组测试数据的第一行有三个整数n,w,h,n表示共有n个目标打击点,w表示目标区域的横向长度,h表示目标区域的纵向长度。
随后的n行,都有两个整数xi和ri,xi表示第i个目标打击点的的横坐标(最左边为0),ri表示该目标打击点能火力覆盖的圆的半径
输出
每组测试数据输出一个正整数,表示共需要多少个目标打击点,每个输出单独占一行。
如果不存在一种能够把整个目标区域火力覆盖的方案,请输出0。
样例输入
2
2 8 6
1 1
4 5
2 10 6
4 5
6 5
样例输出
1
2
- #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;
- ++cou;
- }
- if(end < w||cou > n){
- printf("0\n");
- }
- else{
- printf("%d\n", cou);
- }
- }
- return 0;
- }
问题H: 搬木头的熊二
时间限制: 1 Sec 内存限制: 128 MB
题目描述
东北原始森林经历了风暴袭击,光头强的房子被摧毁了。正好森林有被风暴摧毁而散落的木头,熊大和熊二决定帮可怜的光头强修一座新房子。熊大负责把散落的木头收集成堆,熊二负责搬木头。熊二决定把所有的木头合成一堆。 因为熊二比较懒,为了省力气,熊二开始想点子了:
每一次合并,熊二可以把两堆木头合并到一起,消耗的体力等于两堆木头的重量之和。可以看出,所有的木头经过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);
-
- }
- }