AtCoder ABC001 A,B,C,D题

本文详细解析了AtCoder ABC001的A、B、C、D四道题目。A题是基础的A+B变形,通过输入的两个数直接相减求解。B题涉及if判断,根据输入的数值输出对应阶段的答案。C题讨论了如何根据风向和风程计算方位和风速。D题则涉及时间处理,包括舍入和区间合并的操作。
摘要由CSDN通过智能技术生成

A题:这是一道A+B的变形,A-B。

#include <bits/stdc++.h>

using namespace std;

int a,b;

int main()

{

cin>>a>> b;

cout<<a-b<<endl;

return 0;

}

B题:这是一道考察if判断的题,只需要判断a属于哪一个阶段,输出对应答案。

#include<bits/stdc++.h>

using namespace std;

int main()

{

int a;

cin>>a;

if(a<100)cout<<"00";

else if(a<1000)cout<<0<<a/100;

else if(a<=5000)cout<<a/100;

else if(a<=30000)cout<<a/1000+50;

else if(a<=70000)cout<<(a/1000-30)/5+80;

else cout<<"89";

cout<<endl;

}

C题:

题目给出了风向和风程,求出方位和级数。

方位怎么求 :

题目给出了风向,风向的取值决定了方位,直接暴力即可。(如下图表所示)

风速怎么求 :

题目说 6060 秒的风程,可以求出 11 秒的风程,根据每秒的风程可以求出级数。
#include<bits/stdc++.h>
using namespace std;
int a, t, v;
int main(){
    cin>>a>>t;    //风向和风程
    int fast=t/6;
    //求出每10秒的风程(设为10秒,是因为后面就不用打小数了)
    if (t % 6 >= 3) fast++;    //四舍五入string s;
    if (a <= 112) s = "N";
    else if (a<=337) s = "NNE";
    else if (a<=562) s = "NE";
    else if (a<=787) s = "ENE";
    else if (a<= 1012) s = "E";
    else if (a<= 1237) s = "ESE";
    else if (a<= 1462) s = "SE";
    else if (a<= 1687) s = "SSE";
    else if (a<= 1912) s = "S";
    else if (a<= 2137) s = "SSW";
    else if (a<= 2362) s = "SW";
    else if (a<= 2587) s = "WSW";
    else if (a<= 2812) s = "W";
    else if (a<= 3037) s = "WNW";
    else if (a<= 3262) s = "NW";
    else if (a<= 3487) s = "NNW";     
    else s = "N";            //根据风向求出方位
    if (fast <= 2) v = 0;
    else if (fast <= 15) v = 1;
    else if (fast <= 33) v = 2;
    else if (fast <= 54) v = 3;
    else if (fast <= 79) v = 4;
    else if (fast <= 107) v = 5;
    else if (fast <= 138) v = 6;
    else if (fast <= 171) v = 7;
    else if (fast <= 207) v = 8;
    else if (fast <= 244) v = 9;
    else if (fast <= 284) v = 10;
    else if (fast <= 326) v = 11;
    else v = 12;//求出级数
    if (!v) puts("C 0"); 
    //级数为0需要特判
    else cout << s << ' ' << v << endl;
}

D题:

如题意,我们需要整理时间。

对于舍去,我们只需要判断个位,减去或者加上相应的数即可。

而对于某些结束时间的数字,如 59 这类,舍入后变成了 60。这个时候需要进位,否则就会出现 11:60。

对于合并操作,我们按照起始时间排序,记录当前段的左右端点。

若当前段的结束时间早于下一段的起始时间,则直接输出。否则则合并这两段区间。

#include<bits/stdc++.h>
using namespace std;
int n;
struct node
{
	int st,la;//起点终点
};
node e[10000000];
bool cmp(node a,node b)

	return a.st<b.st;
}

void gout(int x,int y)
{//输出,因为要输出前缀0,所以特判。
	if(x<10)cout<<"0";//按位输出前缀0
	if(x<100)cout<<"0";
	if(x<1000)cout<<"0";
	printf("%d-",x);
	if(y<10)cout<<"0";
	if(y<100)cout<<"0";
	if(y<1000)cout<<"0";
	printf("%d\n",y);
}
intmain()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d-%d",&e[i].st,&e[i].la);//输入时间//以下为特判
		if(e[i].st%10>0&&e[i].st%10<5){
			e[i].st-=e[i].st%10;
		}
		if(e[i].st%10>5){
			e[i].st=e[i].st-e[i].st%10+5;
		}
		if(e[i].la%10>0&&e[i].la%10<5){
			e[i].la=e[i].la-e[i].la%10+5;
		}
		if(e[i].la%10>5){
			e[i].la=e[i].la-e[i].la%10+10;	
			if(e[i].la%100==60)e[i].la=e[i].la-60+100;//进位
		}			
	}
	sort(e+1,e+n+1,cmp);
	int l=e[1].st,r=e[1].la;//记录起点终点
	for(int i=2;i<=n;i++){
		if(r<e[i].st){//特判两种情况
			gout(l,r);
			l=e[i].st,r=e[i].la;
			continue;
		}
		if(r>=e[i].st&&r<=e[i].la){
			r=e[i].la;
			continue;
		}		
	}
	gout(l,r);//输出最后一段
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值