acm之旅--湖南大学保研训练赛0


题目链接: 湖南大学保研训练赛0
又是能做出来的没有做出来。。。

A - Cards

题目链接:A - Cards

  • 思路:水题,排序,首尾为一对即可。

代码:

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

struct Node
{
    int id, v;
    bool operator < (const Node &A) const
    {
        return v<A.v;
    }
};
Node T[200];

int main()
{
    int n;
    cin >> n;
    for(int i=1; i<=n; i++)
    {
        cin >> T[i].v;
        T[i].id = i;
    }
    sort(T+1, T+n+1);
    for(int i=1; i<=n/2; i++)
    {
        printf("%d %d\n", T[i].id, T[n-i+1].id);
    }
    return 0;
}
B - Cells Not Under Attack

题目链接:B - Cells Not Under Attack

  • 思路:这道题主要是容易超时,因此需要将行和列分开来计算。使用row和col数组标记哪一行和哪一列被占用,使用r和c记录多少个行和多少个列被标记占用。最后(n-r)*(n-c)即为结果。

代码:

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

typedef long long LL;
const int MAX = 100005;
int row[MAX], col[MAX];

int main()
{
    LL n, m, a, b;
    LL sum, r, c;
    while(scanf("%lld%lld", &n, &m)!=EOF)
    {
        memset(row, 0, sizeof(row));//记录哪一行和哪一列被占用
        memset(col, 0, sizeof(col));
        r = 0, c = 0;//记录有多少行和列被占用
        while(m--)
        {
            scanf("%lld%lld", &a, &b);
            if(!col[b])//当前列没有被直接占用
            {
                col[b] = 1;
                c++;
            }
            if(!row[a])
            {
                row[a] = 1;
                r++;
            }
            printf("%lld\n", (n-r)*(n-c));
        }
    }
    return 0;
}
C - They Are Everywhere

题目链接:C - They Are Everywhere

  • 思路:尺取法,但是我不知道测试的时候那个代码为什么没有调通。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <map>
using namespace std;

int n;
string s;
int main()
{
    while(cin >> n)
    {
        set<char> Set;
        map<char, int> m;
        cin >> s;
        for(int i=0; i<n; i++)
        {
            Set.insert(s[i]);
        }
        int num = Set.size(), sum = 0, len = 1<<29;
        int st = 0, ed = 0;
        for(ed=0; ed<n; ed++)
        {
            m[s[ed]]++;
            while(m[s[st]]>1 && st<ed)//更新首部下标,且要保证字符种类不减少
            {
                m[s[st]]--, st++;
            }
            if(m.size()==num)//更新结果
                len = min(len, ed-st+1);
        }
        cout << len << endl;
    }
    return 0;
}
D - As Fast As Possible

题目链接:D - As Fast As Possible

  • 思路:这道题是纯数学推导题,代码很少,我连题意都理解错了。参考博文:D - As Fast As Possible

代码:

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

int main()
{
    int n, k;
    double l, v1, v2, T = 0;
    cin >> n >> l >> v1 >> v2 >> k;
    int cnt = (n+k-1)/k;
    double l1 = (v1+v2)*l/(2*v1*(cnt-1)+v1+v2);
    double ans = l1/v2+(l-l1)/v1;
    printf("%.10f\n", ans);
    return 0;
}
E - Connecting Universities

题目链接:E - Connecting Universities

  • 思路:参考博文:E - Connecting Universities
    cnt[now]表示在now点之后遍历的(包括now结点)结点中标记结点的个数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值