A: 超大型 LED 显示屏
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 75 Solved: 42
[Submit][Status][Web Board]
Description
你是学生会体育部长,负责组织一年一度的校篮球比赛。马上就要决赛了,你希望吸引更多的
人来看比赛,因此打算更新一下设备,用一个超大的 LED 屏幕来显示比分。当然,电也不是
不要钱的,所以你决定先分析一下往年的比赛,估计一下大概要耗多少电。
如上图,每个数字由 7 条线段组成,每条亮着的线段每秒钟耗电量为 1 个单位。线段不亮的时
候不耗电。为了省电,比分不显示前导 0(不过 0 分的时候要显示数字 0)。
你的 LED 显示屏共包含 6 个数字,即双方的比分各有 3 位数。
Input
输入包含不超过 100 组数据。每组数据第一行为"START hh:mm:ss",表示比赛开始时刻为
hh:mm:ss。最后一行为"END hh:mm:ss",即比赛结束时刻。二者之间至少会有一个 SCORE 信
息,格式为"SCORE hh:mm:ss team score",其中 team 要么是"home"(主场)要么是"guest"(客
场), score 表示得分,为 1,2 或者 3。这些信息保证按照时间从早到晚的顺序排列,且任意两
条 SCORE 信息的时刻均不相同。比赛开始时间不会早于 9:00,结束时间不会晚于同一天的
21:00。注意,如果比赛开始时间为 09:00:00,结束时间为 09:00:01,比赛长度为 1 秒钟,而不
是 2 秒钟。
Output
对于每组数据,输出测试点编号和总耗电量。
Sample Input
START 09:00:00
SCORE 09:01:05 home 2
SCORE 09:10:07 guest 3
END 09:15:00
START 09:00:00
SCORE 10:00:00 home 1
SCORE 11:00:00 home 1
SCORE 12:00:00 home 1
SCORE 13:00:00 home 1
SCORE 14:00:00 home 1
SCORE 15:00:00 home 1
SCORE 16:00:00 home 1
SCORE 17:00:00 home 1
SCORE 18:00:00 home 1
SCORE 19:00:00 home 1
SCORE 20:00:00 home 1
END 21:00:00
Sample Output
Case 1: 9672
Case 2: 478800
【分析】
模拟题,细心点就好了
#include<bits/stdc++.h>
using namespace std;
const int e[10]={6,2,5,5,4,5,6,3,7,6};
char a[10],b[10];
int main()
{
int l=100,j=0;
int h,m,t,s,h0,m0,s0,score,x1,x2,pp1,pp2;
while(l--)
{
int sum1=0,sum2=0;
x1=e[0];x2=e[0];pp1=0;pp2=0;
while(~scanf("%s%d:%d:%d",a,&h,&m,&s))
{
if(a[1]=='T')
{
h0=h;m0=m;s0=s;//cout<<"1\n";
}
if(a[1]=='C')
{
t=(h-h0)*3600+(m-m0)*60+(s-s0);
h0=h;m0=m;s0=s;
scanf("%s%d",b,&score);
//pp+=score;
sum1+=x1*t;sum2+=x2*t;
if(b[0]=='h')
{
pp1+=score;
if(pp1>=10&&pp1<100)x1=e[pp1%10]+e[pp1/10];
else if(pp1>=100)x1=e[pp1%10]+e[pp1/10%10]+e[pp1/100];
else x1=e[pp1];
}
if(b[0]=='g')
{
pp2+=score;
if(pp2>=10&&pp2<100)x2=e[pp2%10]+e[pp2/10];
else if(pp2>=100)x2=e[pp2%10]+e[pp2/10%10]+e[pp2/100];
else x2=e[pp2];
}
}
if(a[0]=='E')
{
t=t=(h-h0)*3600+(m-m0)*60+(s-s0);
sum1+=x1*t;sum2+=x2*t;
cout<<"Case "<<++j<<": "<<sum1+sum2<<endl;
break;//cout<<"3\n";
}
}
}
}
Problem F: zbj的可乐
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 274 Solved: 78
Description
zbj最近特别想喝可乐,然而可口可乐有一个万年梗的活动就是....四个瓶盖换一瓶可乐的活动
现在zbj想喝n瓶可乐,一瓶可乐需要k元,问他最少需要花多少钱?
ps.一瓶可乐只有一个瓶盖..当然这不是脑筋急转弯,zbj并不能向别人借瓶盖。
Input
有多组样例,每一行输入一个正整数n,k(0<=n<=100000000 1<=k<=200) (请不要嘲讽zbj能喝...我们要友好和谐)
Output
每一行输出一个正整数表示zbj最小需要花的钱
Sample Input
1597 3
Sample Output
3594
【分析】
-
4个瓶盖换一瓶,所以除了前4瓶是买的4瓶,之后都是3瓶以及最后的n的余数;所以求余数m,总数n减掉m即为买的数目,再加上第一次要买一个,和最后一次除不尽的时候少买一个;
-
如果余数为0,减多了,所以要再加上1;
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n;
int k;
while(~scanf("%lld%d",&n,&k))
{
if(n==0)
{
cout<<"0\n";
continue;
}
int m=n%4;
long long x,y=0;
y=n-(n-m)/4;
if(m==0) y++;
cout<<y*k<<endl;
}
return 0;
}
Problem H: wjw的火车站
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 100 Solved: 58
Description
wjw最近新开了一座火车站...没错就是火车站,因为寒假过完同学们都该返校了,所以他准备大干一场,但是这里有一个问题,因为wjw的资金不足,所以这座火车站只有一条铁路,所有的火车从一侧进入,从另一侧出来,但是为了方便调度火车,所以wjw机智的修改了一下铁路。如下图,如果火车A首先进入铁路,然后火车B在火车A离开之前进入铁路,则火车A只有在火车B离开后才能离开。那么现在问题来了,有一串火车按给定顺序进入车站,wjw希望在通过他的一波操作使这列火车以另一个顺序开出火车站,但是他的智商并不支持他解决这个问题,所以你的任务是确定在给定进站顺序和出站顺序的情况下,给出调度操作。
Input
输入包含多组数据。每个测试数据包含一个正整数n表示火车数,接下去的两个序列表示进站顺序和出站顺序,火车编号为小写或大写字母,(a≠A)
Output
输出数据包含一个字符串“Yes.”或“No.”,表示是否有可行的调度方案,若有,则输出调度操作。
Sample Input
3 ABC CBA
3 abc cab
Sample Output
Case #1: Yes.
in
in
in
out
out
out
Case #2: No.
【分析】
-
就是栈;并且已经给定了入栈和出栈的先后顺序,就简单很多很多了;
-
定义两个字符数组s、v,分别存储输入的两个字符串;将s压入栈中,进入一个就和v作比较,如果栈顶元素和v的对应位置元素相等,就pop出;
-
最后如果栈为空,表示该出入顺序可行;
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000;
char s[maxn],v[maxn];
int f[maxn];
stack<char> a;
int main()
{
int n,pp=1;
while(~scanf("%d%s%s",&n,s,v))
{
while (!a.empty()) a.pop();//清空栈
int len=0,l=0;
for(int i=0;i<n;i++)
{
a.push(s[i]); //入栈
f[l++]=1; //1 in //调度信息,都是入栈所以定为1
//2 out
while((!a.empty())&&v[len]!='\0'&&a.top()==v[len])//出栈元素和v数组对应元素不等时循环结束
{
len++;
a.pop();
f[l++]=2;
}
}
printf("Case #%d: ",pp++);
if(v[len]=='\0')//v数组清空了
{
printf("Yes.\n");
for(int i=0;i<l;i++)
{
if(f[i]==1)cout<<"in\n";
else cout<<"out\n";
}
}
else printf("No.\n");
}
return 0;
}