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; }
标签:咖啡,int,sixth,pos,long,include,se 来源: https://www.cnblogs.com/yctql/p/14421900.html