标签:60 00 01 int 29 char 字幕 2021 result
2020安徽省省赛H
目录
一.题目说明
H. 字幕校对
输入说明
输出说明
输入样例
输出样例
二.解题思路
三.代码实现
四.运行结果
1.样例
2.
3.
一.题目说明
H. 字幕校对
伴随着中国国产影视作品风靡国外,听不懂汉语的观众需要英文字幕的帮忙才能理解影片故事情节。现在小喇叭接到了这样一个任务,他需要按照标准.STA 字幕格式的需要,对字幕文件进行编辑。标准英文字母格式如下:
[Ordinal number of the block]
[Beginning time of the subtitles --> Ending time of the subtitles]
[Subtitle text in one or more lines]
每两个字幕信息之间用一行空行隔开。时间格式为HH:MM:SS,TTT(注意是英 文的冒号和逗号),表示 小时:分钟:秒,毫秒。
这是一个.STA格式文件的样例:
1
00:00:01,600 --> 00:00:04,200
Good day!
2
00:00:05,900 --> 00:00:07,999
Good day to you too!
Here you go!
3
00:00:10,000 --> 00:00:14,000
May I please have ten garlic sausages?
由于影片播放时需要对原有视频进行编辑以适应播出时长,所以字母文件也 要做适当的调整,因此小喇叭的任务就是编写程序完成对字幕文件的编辑。
输入说明
每个测试样例最多不超过30行。第一行是字幕序号,第2行是按照.STA字幕 格式的时间信息,第3行开始时字母信息,可能有多行字幕。为了便于处理,字 幕中仅包含大小写字母和如下符号 ',.?!。('。'不含在内) 最后一个字幕信息块后是一个'#'号,表明本测试样例末尾。 '#'号之后是一个整数T(-10000<=T<=10000),表示需要对字幕文件中时间信息 进行调整的偏移量。输出说明
按照给出的T(毫秒)编辑需求,调整字母文件中的时间信息(每个字幕块 中的开始和结束时间)。并将修改好时间的字幕文件打印出来。测试数据保证编 辑后的时间不会出现负值。输入样例
8 00:00:01,600 --> 00:00:04,200 We thought you was... 9 00:00:05,900 --> 00:00:07,999 a toad. # 300输出样例
8 00:00:01,900 --> 00:00:04,500 We thought you was... 9 00:00:06,200 --> 00:00:08,299 a toad.二.解题思路
观察发现,需要进行操作的对象仅为第2,2+3,2+3*2,...,行,直至#行,故考虑将读入的每一行字符串作为一个字符串类型数组中的一个元素,仅需要对特定下标的数组元素进行操作。
利用一个字符串类型的数组将所有输入按行存储(不包括最后输入的T数值),然后利用循环将数组中的元素进行输出,当数组元素下标为1,1+3,1+3*2,...,时,加以对数组元素的第一个字符是否是#作出判断来对特定行进行操作,操作为:将这些行按特定符号进行分割,对每一部分也即HH:MM:SS,TTT分别根据输入的T对应的不同情况进行判断赋以相应的操作,值得注意的是操作后对该行进行输出时也要按照HH:MM:SS,TTT的格式进行输出。
三.代码实现
#include<iostream>
#include<vector>
#include<stdlib.h>
#include<cstring>
#include<math.h>
using namespace std;
// 根据给定符号分割字符串
vector<string> split(const string &ip, char ch)
{
vector<string> result;
int start = 0;
for (int i = 0; i < ip.size(); ++i)
{
if (ip[i] == ch)
{
result.push_back(string(ip.begin() + start, ip.begin() + i));
start = i + 1;
}
}
if (start < ip.size())
{
result.push_back(string(ip.begin() + start, ip.end()));
}
return result;
}
int main(){
int maxlen=30;
int T;
string A[maxlen];
for(int i=0;i<maxlen;i++){
getline(cin,A[i]);
if(A[i].at(0)=='#'){
break;
}
}
cin>>T;
for(int i=0;i<maxlen;i++){
if(A[i].at(0)=='#'){
cout<<"#";
break;
}
if(i==1||i==4||i==7||i==10||i==13||i==16||i==19||i==22||i==25||i==28){
int HH1_,MM1_,SS1_,TT1_,HH2_,MM2_,SS2_,TT2_=0;
char c1=':';
vector <string> result=split(A[i],c1);
char a1[20];
strcpy(a1,result[0].c_str());
char a2[20];
strcpy(a2,result[1].c_str());
char a3[20];
strcpy(a3,result[3].c_str());
int HH1=atoi(a1);
int MM1=atoi(a2);
int MM2=atoi(a3);
char c2=',';
vector <string> result1=split(result[2],c2);
char a4[20];
strcpy(a4,result1[0].c_str());
int SS1=atoi(a4);
char c3='>';
vector <string> result3=split(result1[1],c3);
char a7[20];
strcpy(a7,result3[1].c_str());
int HH2=atoi(a7);
char c4='-';
vector <string> result4=split(result3[0],c4);
char a8[20];
strcpy(a8,result4[0].c_str());
int TT1=atoi(a8);
vector <string> result2=split(result[4],c2);
char a5[20];
strcpy(a5,result2[0].c_str());
char a6[20];
strcpy(a6,result2[1].c_str());
int SS2=atoi(a5);
int TT2=atoi(a6);
if(T>=0){
int m=TT1+T;
if(m>=1000){
TT1_=m-1000;
int m1=SS1+m/1000;
if(m1>=60){
SS1_=m1-60;
}
else if(m1<60){
SS1_=m1;
}
int m2=MM1+m1/60;
if(m2>=60){
MM1_=m2-60;
HH1_=HH1+m2/60;
}
else if(m2<60){
MM1_=m2;
HH1_=HH1;
}
}
else if(m<1000){
TT1_=m;
SS1_=SS1;
MM1_=MM1;
HH1_=HH1;
}
int n=TT2+T;
if(n>=1000){
TT2_=n-1000;
int n1=SS2+n/1000;
if(n1>=60){
SS2_=n1-60;
}
else if(n1<60){
SS2_=n1;
}
int n2=MM2+n1/60;
if(n2>=60){
MM2_=n2-60;
HH2_=HH2+n2/60;
}
else if(n2<60){
MM2_=n2;
HH2_=HH2;
}
}
else if(n<1000){
TT2_=n;
SS2_=SS2;
MM2_=MM2;
HH2_=HH2;
}
}
else if(T<0){
int m=TT1-abs(T);
if(-1000<=m && m<0){
if(m==-1000){
TT1_=0;
}
else{
TT1_=1000-abs(m);
}
int m1=SS1-1;
if(m1<0){
SS1_=59;
int m2=MM1-1;
if(m2<0){
MM1_=59;
HH1_=HH1-1;
}
else if(m2>=0){
MM1_=m2;
HH1_=HH1;
}
}
else if(m1>=0){
SS1_=m1;
MM1_=MM1;
HH1_=HH1;
}
}
else if(m>=0){
TT1_=m;
SS1_=SS1;
MM1_=MM1;
HH1_=HH1;
}
int n=TT2-abs(T);
if(-1000<=n && n<0){
if(n==-1000){
TT2_=0;
}
else{
TT2_=1000-abs(n);
}
int n1=SS2-1;
if(n1<0){
SS2_=59;
int n2=MM2-1;
if(n2<0){
MM2_=59;
HH2_=HH2-1;
}
else if(n2>=0){
MM2_=n2;
HH2_=HH2;
}
}
else if(n1>=0){
SS2_=n1;
MM2_=MM2;
HH2_=HH2;
}
}
else if(n>=0){
TT2_=n;
SS2_=SS2;
MM2_=MM2;
HH2_=HH2;
}
}
if(HH1_/10==0){
cout<<0<<HH1_<<":";
}
else{
cout<<HH1_<<":";
}
if(MM1_/10==0){
cout<<0<<MM1_<<":";
}
else{
cout<<MM1_<<":";
}
if(SS1_/10==0){
cout<<0<<SS1_<<",";
}
else{
cout<<SS1_<<",";
}
if(TT1_/10==0){
cout<<0<<0<<TT1_<<" --> ";
}
else if(TT1_/100==0){
cout<<0<<TT1_<<" --> ";
}
else{
cout<<TT1_<<" --> ";
}
if(HH2_/10==0){
cout<<0<<HH2_<<":";
}
else{
cout<<HH2_<<":";
}
if(MM2_/10==0){
cout<<0<<MM2_<<":";
}
else{
cout<<MM2_<<":";
}
if(SS2_/10==0){
cout<<0<<SS2_<<",";
}
else{
cout<<SS2_<<",";
}
if(TT2_/10==0){
cout<<0<<0<<TT2_<<endl;
}
else if(TT2_/100==0){
cout<<0<<TT2_<<endl;
}
else{
cout<<TT2_<<endl;
}
}
else{
cout<<A[i]<<endl;
}
}
return 0;
}
四.运行结果
1.样例
2.
3.
标签:60,00,01,int,29,char,字幕,2021,result 来源: https://blog.csdn.net/acolasio_/article/details/113405059
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。