Codeforces Round #705 (Div. 2)
A. Anti-knapsack
这题做的第二遍了哈哈,一下子就做出来了表扬!👍
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
typedef long long LL;
const int N=1e5+10,INF=0x3f3f3f3f;
int a[N];
int main()
{
int t;
cin>>t;
while (t--)
{
int n,k;
cin>>n>>k;
if(n==1) puts("0");
else if(k%2==1){
cout<<n-1-k/2<<endl;
for(int i=k/2+1;i<=n;i++)
{
if(i==k) continue;
cout<<i<<" ";
}
puts("");
}else{
cout<<n-k/2<<endl;
for(int i=k/2;i<=n;i++)
{
if(i==k) continue;
cout<<i<<" ";
}
puts("");
}
}
return 0;
}
B. Planet Lapituletti (时间换算+镜像+暴力)
一道关于时间换算,然后判断时间的表面形式是否正确的题目,学会了一种非常巧妙的处理方法化解了时间的换算!
- 我们会先读取特殊的时间制度
hh
,mm
。初始按照string
类型读入,然后通过数组划分(s[0],s[1]···
)读取并转化为的int
类型的hh
,mm
- 处理时间进位:我把它称作先化整再化分!如果按照每次分钟累加达到mm就进位到小时,然后乱七八糟的加减是非常麻烦的!
- 定义一个变量
sum
计算总的分钟数,这是“化整”。 - 然后通过
/m,%m
提取出这个总的分钟数对应的小时hh
,和分钟mm
,这是“化分” - 通过
re()
函数得到每个数字对应的镜像的数字,用check()
函数判断是否符合要求。如果符合要求就输出 - 如果不符合要求,就让
sum++
递增,如果sum=h*m
的时候说明小时和分钟都达到了最大数但是还没有满足要求,直接输出00:00
- 定义一个变量
check
函数判断数字数否符合要求:- 注意镜像后的数字,位数也发生了调换!原来的
s[4]
变成了最高位!
eg:10:05——>20:01
- 当镜像后的个位数字不合要求,返回
false
- 虽然个位数符合要求,但是拼起来的
h>=hh,m>=mm
,超时了也不行,返回false
- 注意镜像后的数字,位数也发生了调换!原来的
这里用string类型来存储时间,然后通过提取s[0],s[1],s[3],s[4]
来换算时间,非常的巧妙,并且利用了可以对string类型进行修改,每次sum++
进行划分的时候直接对string字符串中的每一位分配数字即可
#include<iostream>
#include<algorithm>
using namespace std;
int hh,mm;
string s;
int re(int x)
{
if(x==1)return 1;
else if(x==0) return 0;//比赛的时候这里0没写然后一直WA了5次🥀
else if(x==2) return 5;
else if(x==5) return 2;
else if(x==8) return 8;
else return -1;
}
bool check()
{
int a=re(s[0]-'0');int b=re(s[1]-'0');
int c=re(s[3]-'0');int d=re(s[4]-'0');
if(a==-1||b==-1||c==-1||d==-1) return false;
int x=d*10+c,y=b*10+a;
//cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl<<x<<" "<<y<<endl;
if(x>=hh||y>=mm) return false;
return true;
}
int main()
{
int t;
cin>>t;
while (t--)
{
cin>>hh>>mm>>s;
int sum=(s[0]-'0')*10+(s[1]-'0');
sum*=mm;
sum+=(s[3]-'0')*10+(s[4]-'0');
for(sum;;sum++)
{
if(sum==hh*mm)
{
cout<<"00:00"<<endl;
break;
}
int h=sum/mm,m=sum%mm;
s[0]=h/10+'0',s[1]=h%10+'0',s[3]=m/10+'0',s[4]=m%10+'0';
if(check())
{
for(int i=0;i<=4;i++)
cout<<s[i];
puts("");
break;
}
}
}
return 0;
}