sixth

CodeForces - 1041B 

思路:将x,y求最大公约数g,然后化为最简。
最大公约数用辗转相除法求解

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

long long gcd(long long a , long long b)
{
    long long c = a % b;
    while(c)
    {
        a = b;
        b = c;
        c = a % b;
    }
    return b;
}

int main()
{
    long long a , b , x , y;
    scanf("%lld%lld%lld%lld" , &a , &b , &x , &y);
    
    long long c = gcd(x , y);
    
    x /= c;
    y /= c;
    
    cout << min((a / x) , (b / y));
    return 0;
}

 

  CodeForces - 1041C 

思路:

某人要在n天内喝n杯咖啡,每杯咖啡都有一个喝的时间点单位是min,如果两杯咖啡在一天喝,那么它们之间至少要相隔d min,要求输出最少几天可以喝完,并输出对应题目输入的每一杯咖啡是在第几天喝的(假设输出第一个数w,w代表第一杯咖啡是在第w天喝的)。当然,输出不唯一,那么我们可以找出一种情况是最早喝的那杯咖啡(ai min )在某一天中一定是第一杯,我们就直接让它在第一天被喝,由此可以推出下一杯咖啡时间至少要 >= ai + d + 1,于是一直往下找即可,如果找不到就说明这一天已经不能喝了,另开一天即可

#include<bits/stdc++.h>
using namespace std;
const int maxn = (int)2e5 + 10;
int a[maxn],b[maxn];
set<pair<int,int> > se;
int main()
{
    int n,m,d;
    scanf("%d %d %d",&n,&m,&d);
    for (int i = 0;i < n;i ++)
    {
        scanf("%d",&a[i]);
        se.insert(make_pair(a[i],i));
    }
    int cnt = 0,pos;
    while (!se.empty())
    {
        pos = se.begin() -> second;
        b[pos] = ++ cnt;
        se.erase(se.begin());
        while (1)
        {
            auto t = se.lower_bound({a[pos] + d + 1,0});
            if (t == se.end())
                break;
            pos = t -> second;
            b[pos] = cnt;
            se.erase(t);
        }
    }
    printf("%d\n%d",cnt,b[0]);
    for (int i = 1;i < n;i ++)
        printf(" %d",b[i]);
    return 0;
}

 

上一篇:Java SE基础小知识


下一篇:学习笔记:Java SE(2)