暑假训练赛六

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

[Submit][Status][Web Board]

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

【分析】

  1. 4个瓶盖换一瓶,所以除了前4瓶是买的4瓶,之后都是3瓶以及最后的n的余数;所以求余数m,总数n减掉m即为买的数目,再加上第一次要买一个,和最后一次除不尽的时候少买一个;

  2. 如果余数为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

[Submit][Status][Web Board]

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

猜你喜欢

转载自blog.csdn.net/qq_38735931/article/details/81252485