Codeforces Round #705 (Div. 2)

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 (时间换算+镜像+暴力)

一道关于时间换算,然后判断时间的表面形式是否正确的题目,学会了一种非常巧妙的处理方法化解了时间的换算!

  1. 我们会先读取特殊的时间制度hh,mm。初始按照string类型读入,然后通过数组划分(s[0],s[1]··· )读取并转化为的int类型的hh,mm
  2. 处理时间进位:我把它称作先化整再化分!如果按照每次分钟累加达到mm就进位到小时,然后乱七八糟的加减是非常麻烦的!
    1. 定义一个变量sum计算总的分钟数,这是“化整”。
    2. 然后通过/m,%m提取出这个总的分钟数对应的小时hh,和分钟mm,这是“化分”
    3. 通过re()函数得到每个数字对应的镜像的数字,用check()函数判断是否符合要求。如果符合要求就输出
    4. 如果不符合要求,就让sum++递增,如果sum=h*m的时候说明小时和分钟都达到了最大数但是还没有满足要求,直接输出00:00
  3. check函数判断数字数否符合要求:
    1. 注意镜像后的数字,位数也发生了调换!原来的s[4]变成了最高位!
      eg:10:05——>20:01
    2. 当镜像后的个位数字不合要求,返回false
    3. 虽然个位数符合要求,但是拼起来的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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值