群赛9总结----2017.9.16(奇怪题目)

T1 独立思考

题意:

给你一串数字,一个一个输入,同时输出时每一行都从大到小.

解法:

数据结构体.

代码:

#include<bits/stdc++.h>
using namespace std;
int x[100010];
bool y[100010];
int main() {
    int a,b;
    cin>>a;
    b=a;
    for(int i=1; i<=a; i++)
        cin>>x[i];
    for(int i=1; i<=a; i++) {
        y[x[i]]=true;
        if(x[i]==b) {
            while(y[b]==true) {
                cout<<b<<" ";
                b--;
            }
        }
        cout<<endl;
    }
    return 0;
}

网址:这一题

小结:

**此类题目水题。**

T2 发挥想象

题意:

有几个人在排队,每个人都要看k分钟,每个人都有开始时间,服务台有开始时间和结束时间,问玛丽该什么时候

解法:

暴力.

代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    long long ts, tf, t, n, p, i, j, ans, b, a, min = 1e12+7;
    cin >> ts >> tf >> t;
    cin >> n;
    ans = ts;
    b = ts;
    for (i = 0; i < n; i++)
    {
        cin >> a;
        if (b + t > tf)
            break;
        if (a <= b)
        {
            if (b - a + 1 < min)
            {
                min = b - a + 1;
                ans = a - 1;
            }
            b += t;
        }
        else
        {
            cout << b;
            return 0;
        }
    }
    if (b + t <= tf)
        cout << b;
    else
        cout << ans;
    return 0;
}

网址:这一题

小结:

**此类题目暴力,横扫一遍。**

T3 沉着专注

题意:

有一串点灯,每个点灯都有一个热值,剪成三段让每一段点灯的热值和相同,再输出剪断的是哪根.

解法:

搜索.

代码:

#include <bits/stdc++.h>
using namespace std;
vector<int> v[1000001], ans;
int val[1000001], dp[1000001];
long long tot;
void dfs(int x, int y)
{
    dp[x] = val[x];
    int i, j, z;
    for (i = 0; i < v[x].size(); i++)
    {
        z = v[x][i];
        if (z != y)
        {
            dfs(z, x);
            if (dp[z] == tot)
                ans.push_back(z);
            else
                dp[x] += dp[z];
        }
    }
}
int main()
{
    int n, i, p, c;
    tot = 0;
    scanf("%d", &n);
    for (i = 1; i <= n; i++)
    {
        scanf("%d%d", &p, &c);
        v[p].push_back(i);
        v[i].push_back(p);
        val[i] = c;
        tot += c;
    }
    if (tot % 3)
    {
        printf("-1");
        exit(0);
    }
    tot /= 3;
    dfs(v[0][0], 0);
    if (ans.size() < 2)
        printf("-1");
    else
        printf("%d %d", ans[0], ans[1]);
    return 0;
}

网址:这一题

小结:

**此类题目预处理。**

T4 洛阳亲友如相问

题意:

某个人喜欢喝牛奶,每天至少喝k瓶,家里有n瓶,超市里有m瓶,每个牛奶都有一个保质期.不可以有没喝完的牛奶,问最多可以从超市里买几瓶.

解法:

预处理.

代码:

#include <bits/stdc++.h>
using namespace std;
pair<int, int> sm[1000010];
int n, m, k, tou[10000010] = {0}, sc[1000010];
int main()
{
    int a, i, j, t = 0, p = 0;
    cin >> n >> m >> k;
    for (i = 1; i <= n; i++)
    {
        scanf("%d", &a);
        tou[a]++;
    }
    for (i = 0; i <= 10000000; i++)
    {
        tou[i] = k - tou[i];
        if (tou[i] < 0)
        {
            cout << "-1";
            return 0;
        }
    }
    for (i = 1; i <= m; i++)
    {
        scanf("%d", &sm[i].first);
        sm[i].second = i;
    }
    sort(sm + 1, sm + m + 1);
    for (i = 1; i <= m; i++)
    {
        for (j = p; j <= sm[i].first; j++)
            if (tou[j] > 0)
            {
                tou[j]--;
                if (tou[j] == 0)
                    while (tou[p] == 0)
                        p++;
                t++;
                sc[t] = sm[i].second;
                break;
            }
    }
    printf("%d\n", t);
    for (i = 1; i <= t; i++)
        printf("%d ", sc[i]);
}

网址:这一题

小结:

**此类题目预处理就行了。**

T5 就说我在码代码

题意:

售货员不喜欢找钱,你有无数的整百和一些零钱,每天售货员的找钱都有一个愤怒值输出最小的愤怒值,和每天的付出的整百数.

解法:

暴力.

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 233333, M = 111;
long long w[N];
int f[N], c[N];
struct node
{
    int i;
    bool friend operator<(node a, node b)
    {
        return w[a.i] > w[b.i];
    }
};
priority_queue<node> q;
int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &c[i]);
    }
    for (int i = 0; i < n; i++)
    {
        int k;
        scanf("%d", &k);
        w[i] = k * (100 - c[i] % 100);
    }
    long long ans = 0;
    memset(f, 0, sizeof(f));
    for (int i = 0; i < n; i++)
        if (c[i] % 100)
        {
            m -= c[i] % 100;
            q.push((node){i});
            if (m < 0)
            {
                int j = q.top().i;
                q.pop();
                ans += w[j];
                m += 100;
                f[j] = 1;
            }
        }
    cout << ans << endl;
    for (int i = 0; i < n; i++)
    {
        if (f[i])
            printf("%d 0\n", c[i] / 100 + 1);
        else
            printf("%d %d\n", c[i] / 100, c[i] % 100);
    }
    return 0;
}

网址:这一题

小结:

**此类题目较难。**
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值