F. Hamburger Steak
题目:给一堆汉堡和要煎汉堡的时间,还有锅的数量。求最少时间,还要输出方案。
思路:其实本题有点像洛谷搜索题单第二题,我第一眼就看了出来。但是本题要更复杂,但是思想有点类似。就是这个最少时间要么是全部加起来除以锅的数量, 要么是最大的汉堡时间。我们依次就可以先把每个锅定一个容量。然后就放,直接放,不够就放到下一个里面。当时就是死脑筋非要在一个锅里面煎。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
using ll = long long;
const int maxn = 1e5 + 10;
ll num[maxn];
int main(){
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n, m;
cin >> n >> m;
ll MAX = 0;
ll sum = 0;
for(int i = 1; i <= n; i++)
{
cin >> num[i];
MAX = max(num[i], MAX);
sum += num[i];
}
ll tmp = sum/m;
if(tmp*m < sum) tmp++;
MAX = max(MAX, tmp);
ll now = 1, cnt = 0;
for(int i = 1; i <= n; i++){
if(num[i] + cnt <= MAX){
cout << 1 << ' ' << now << ' ' << cnt << ' ' << cnt + num[i] << endl;
cnt += num[i];
if(cnt == MAX){
cnt = 0;
now++;
}
}else{
cout << 2 << ' ' << now+1 << ' ' << 0 << ' ' << num[i]-MAX+cnt << ' ' << now << ' ' << cnt << ' ' << MAX << endl;
cnt = num[i]+cnt-MAX;
cnt %= MAX;
now++;
}
}
}
I. Intervals on the Ring
题目:构造一个区间集合,使它的交集是我们给的区间集合。
思路:主要是本题有一种集合当l > r的时候,可以回过来,随便画一下,直接发现就是当前的头到上一个的尾巴,最后一个是第一个的尾巴。
代码:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int maxn = 1010;
struct vv{
int l, r;
}p[1000];
bool book[1010];
bool cmp(vv a, vv b)
{
if(a.l == b.l) return a.r < b.r;
return a.l < b.l;
}
int main(){
int t;
cin >> t;
while(t--){
int n, m;
cin >> n >> m;
for(int i = 0; i < m; i++){
cin >> p[i].l >> p[i].r;
}
sort(p, p+m, cmp);
cout << m << endl;
for(int i = 0; i < m; i++){
cout << p[(i+1)%m].l << ' ' << p[i].r << endl;
}
}
}