Problem A Secret of Chocolate Poles
题意就是有高度为1的黑块和白块,还有高度为k的黑块,要求底层和顶层都是黑色,问高度不超过h的所有摆放可能的方法
思路: 动态规划进行状态转移.
用dp[i][j] 来表示高度为i,顶层颜色为j时候的摆放方案数,j 为 0 代表白色,j 为 1代表 黑色
#include<bits/stdc++.h>
using namespace std;
long long dp[110][2];
int main(){
long long l,k;
cin >> l >> k;
dp[1][1] = 1;
dp[0][0] = 1;
for(int i = 2;i <= l;i++){
dp[i][1] = dp[i-1][0];
dp[i][0] = dp[i-1][1];
if(i >= k){
dp[i][1] += dp[i-k][0];
}
}
long long sum = 0;
for(int i = 1;i <= l;i++){
sum += dp[i][1];
}
cout << sum << endl;
}
Problem C Medical Checkup
有n个学生去体检,每个学生每次检测耗时ti,学生排成一队,有无限个体检机器,也拍成一列,学生必须按顺序一个一个体检,一个机器同一时刻只能检查一名同学,求t时刻,每名同学的位置。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,t;
int main(){
cin >> n >> t;
ll x;ll Max = 0;ll sum = 0;
for(int i = 1;i <= n;i++){
cin >> x;
sum += x;
Max = max(Max,x);
if(sum > t){
cout << 1 << endl;
}else{
cout << (t-sum)/Max + 2 << endl;
}
}
}
Problem B Parallel Lines
给n个点,n为偶数,把这些点练成线段,每个顶点只能属于一条线段,问最多的平行边的组数。
一开始我想错了,没有考虑图中存在两种斜率的直线的情况,于是我一直跑不过最后一个sample,没明白12怎么来的。
后来队友说直接暴力搜索dfs,
复杂度是151311…3,大概在210e6左右
参照了别人的题解写的dfs,
自己写的话大概还是要调试挺久的。
#include<bits/stdc++.h>
using namespace std;
map<int, map<int, int> > MP;
int x[20], y[20],vis[20];
int n;
int res;
void dfs(int pos, int step, int sum) {
if (step > n / 2) {
res = max(res, sum);
return;
}
if (vis[pos]) dfs(pos + 1, step, sum);
else {
vis[pos] = 1;
for (int i = pos + 1; i <= n; i++) {
if (vis[i]) continue;
vis[i] = 1;
int dx, dy;
if (x[pos] == x[i]) {
dx = dy = 0;
}
else if (y[pos] == y[i]) {
dx = 0;
dy = 100000;
}
else {
dy = y[pos] - y[i];
dx = x[pos] - x[i];
int t = __gcd(abs(dx), abs(dy));
dy /= t; dx /= t;
if (dx < 0) dx *= -1, dy *= -1;
}
MP[dx][dy]++;
dfs(pos + 1, step + 1, sum + MP[dx][dy] - 1);
MP[dx][dy]--;
vis[i] = 0;
}
vis[pos] = 0;
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> x[i] >> y[i];
}
dfs(1, 1, 0);
cout << res << endl;
}
Problem I Starting a Scenic Railroad Service
给了n个人上车的站点和下车的站点,求安排位置的最大数量和最小数量。
看了别人的题解真的猛啊,先是记录上车的点,和下车的点,还记录了一个d,人数的变化。
然后再从前往后扫一遍,就仿佛让静态的点的记录在时间上具有了意义,
这个扫就好像时间轴一样,真的牛逼。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int up[maxn],down[maxn],d[maxn];
int x[maxn],y[maxn];
int main(){
int n;
for(int i = 1;i <= n;i++){
cin >> x[i] >> y[i];
up[x[i]]++,down[y[i]]++,d[x[i]]++,d[y[i]--;
}
for(int i = 1;i <= n;i++){
up[i] += up[i-1];
down[i] += down[i-1];
d[i] += d[i-1];
}
int ans1 = 0,ans2 = 0;
for(int i = 1;i <= n;i++){
ans1 = max(ans1,up[y[i]] - down[x[i]]);
ans2 = max(ans2,d[y[i]]);
}
cout << ans1 << " " << ans2 << endl;
}
没有做出来的题目
Problem F Pizza Delivery
给一个有向图,初始保证1 到 2存在最短路。
下面给出图的m条边,然后之后的m天中,每次都有一条边进行逆转,问那天1到2 的最短路发生怎么样的变化,不变 输出 SOSO,变小 输出 HAPPY,变大了输出 SAD.
Problem G Rendezvous on a Tetrahedron
就是一个正四面体,给定两个方向和距离,从顶点出发,问最后在不在同一个面上。