Codeforces Round #325 (Div. 2)ABC

A - Alena's Schedule

分析:遇到1答案加一,遇到101加一。

#include <iostream>

using namespace std;

int main()
{
    int n, ans = 0, a[105];
    cin >> n;
    for(int i = 0 ; i < n ; i ++) {
        cin >> a[i];
        ans += a[i];
        if(i > 1&&a[i-1] == 0&&a[i-2] == 1&&a[i] == 1) ans ++;
    }
    cout << ans << endl;
    return 0;
}
B - Laurenty and Shop
分析:用数组a把第一排房子到第一个房子的距离存下来,再用一个数组c吧第二排房子和最后一个房子的距离存下来,数组c表示第一排和第二排房子之间的距离,则取a+b+c的最小值就是第一个到最后一个房子之间的距离。返回时不走一样的路,把去超市时的c[i]标记一下,下次不走这条路就行了,a+b+c还是取最小值,相加就可以了。

#include <iostream>
#include <cstring>
using namespace std;

const int INF = 999999999;

int main()
{
    int n, t = INF, t2 = INF, j;
    int a[2][100], b[100];
    memset(a, 0, sizeof(a));
    cin >> n;
    for(int i = 1 ; i < n ; i ++)
        cin >> a[0][i];
    for(int i = 0 ; i < n-1 ; i ++)
        cin >> a[1][i];
    for(int i = 0 ; i < n ; i ++)
        cin >> b[i];
    for(int i = 1 ; i < n ; i ++)
        a[0][i] += a[0][i-1];
    for(int i = n-2 ; i >= 0 ; i --)
        a[1][i] += a[1][i+1];
    for(int i = 0 ; i < n ; i ++) {
        if(a[0][i]+a[1][i]+b[i] < t) {
            t = a[0][i] + a[1][i] + b[i];
            j = i;
        }
    }
    b[j] = INF;
    for(int i = 0 ; i < n ; i ++)
        if(a[0][i]+a[1][i]+b[i] < t2) t2 = a[0][i] + a[1][i] + b[i];
    cout << t+t2 << endl;
    return 0;
}
C - Gennady the Dentist

分析:模拟。

#include <iostream>
#include <cstring>
#define LL long long
using namespace std;

const int maxn = 4000 + 5;
const int INF = 999999999;

LL n, b, ans;
LL v[maxn], d[maxn], p[maxn], q[maxn], a[maxn];

int main()
{
    ans = 0;
    cin >> n;
    for(int i = 1 ; i <= n ; i ++) {
        cin >> v[i] >> d[i] >> p[i];
        q[i] = p[i];
    }
    for(int i = 1 ; i <= n ; i ++) {
        if(p[i] >= 0) {
            a[ans++] = i;
            b = 0;
            for(int j = i+1 ; j <= n ; j ++)
                if(p[j] >= 0) {
                    p[j] -= v[i] + b;
                    if(p[j] < 0) b += d[j];
                    if(v[i]) v[i]--;
                }
        }
    }
    cout << ans << endl;
    for(int i = 0 ; i < ans ; i ++)
        cout << a[i] << ' ';
    cout << endl;
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值