群赛8总结----2017.9.11

T1 k-Factorization

题意:

输入一个数,把他分成b个数,输出.

解法:

暴力.

代码:

#include<bits/stdc++.h>
using namespace std;
int x[10000];
int main()
{
    int n,k,a=0;
    cin>>n>>k;
    while(n!=1)
    {
        for(int i=2; i<=n; i++)
        {
            if(n%i==0)
            {
                a++;
//              cout<<i;
                x[a]=i;
                n=n/i;
                break;
            }
        }
    }
//  cout<<a;
    if(a<k)
        cout<<-1;
    else
    {
        for(int i=a; i>k; i--)
            x[i-1]=x[i-1]*x[i];
        for(int i=1; i<=k; i++)
            cout<<x[i]<<" ";
    }
    return 0;
}

网址:这一题

小结:

**此类题目水题。**

T2 Odd sum

题意:

输入n个数,输出最大的奇数.

解法:

分类讨论,暴力.

代码:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define N 1000000
LL x[N],y[N];
int main()
{
    int a,b,ji=0,ou=0,h=0,max=-10000;
    cin>>a;
    for(int i=1; i<=a; i++)
    {
        cin>>b;
        if(b%2!=0)
        {
            ji++;
            x[ji]=b;
        }
        else
        {
            ou++;
            y[ou]=b;
        }
    }
//  cout<<ji<<ou;
    sort(x+1,x+ji+1);
    sort(y+1,y+ou+1);
    for(int i=ji; i>=1; i--)
    {
        h+=x[i];
        if(h%2!=0&&h>max)
            max=h;
    }
    for(int i=ou; i>=1; i--)
        if(y[i]>0)
            max+=y[i];
    cout<<max;
    return 0;
}

网址:这一题

小结:

**此类题目暴力。**

T3 Minimal string

题意:

把一个字符串经过栈的处理,输出最小值.

解法:

预处理.

代码:

#include<bits/stdc++.h>
#define N 100010
using namespace std;
vector<char> ans;
stack<char> s;
char x[N];
int y[1000];
int main()
{
    char a;
    int chang=0,o;
    while(scanf("%c",&a)==1&&a!=10)
    {
        chang++;
        x[chang]=a;
        y[a]++;
    }
    for(int i=1; i<=chang; i++)
    {
        s.push(x[i]);
        o=0;
        y[x[i]]--;
        while(!s.empty())
        {
            for(int j=s.top()-1; j>=97; j--)
            {
                if(y[j]!=0)
                    o=1;
            }
            if(o==1)
                break;
            else
            {
                ans.push_back(s.top());
                s.pop();
            }
        }
    }
    for(int i=0;i<chang;i++)
    printf("%c",ans[i]);
    return 0;
}

网址:这一题

小结:

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

T4 Broken BST

题意:

给每个点的权值,左右孩子,问用BST搜索法有几个数搜索不到。搜索的数为每一个点的权值。 

解法:

暴力搜索.

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 100020
#define M 1e9
struct node
{
    int l, r, v;
} t[N];
int n, kk, cnt;
bool get[N];
map<int, int> mp, vis;
void dfs(int u, int p, int q)
{
    if (u == -1)
        return;
    if (t[u].v >= p && t[u].v <= q&&mp[t[u].v])
            mp[t[u].v] = 0;
    dfs(t[u].l, p, min(q, t[u].v));
    dfs(t[u].r, max(p, t[u].v), q);
}
int main()
{
    while (cin >> n)
    {
        memset(get, true, sizeof(get));
        mp.clear();
        int num = 0;
        for (int i = 1; i <= n; i++)
        {
            scanf("%d%d%d", &t[i].v, &t[i].l, &t[i].r);
            if (t[i].l != -1)
                get[t[i].l] = false;
            if (t[i].r != -1)
                get[t[i].r] = false;
            mp[t[i].v]++;
        }
        cnt = 0;
        for (int i = 1; i <= n; i++)
            if (get[i])
                kk = i;
        dfs(kk, -M, M);dfs(kk, -M, M);
        for (int i = 1; i <= n; i++)
        {
            cnt += mp[t[i].v];
            mp[t[i].v] = 0;
        }
        printf("%d\n",cnt);
    }
    return 0;
}

网址:这一题

小结:

**此类题目。**

T5 Array Queries

题意:

自己看,不会讲.

解法:

根据题意写就行了,主要是纯暴力会TLE,所以需要dp一下,大概找个区域,这里取350,大于根号100000就行。

代码:

#include<bits/stdc++.h>
using namespace std;
#define N 100000
#define LL long long
pair<LL,LL> gai[N+5];
LL a,b,c;
double yao[N+5];
int main()
{
    cin>>a;
    for(int i=1; i<=a; i++)
        cin>>yao[i];
    for(int i=1; i<=a; i++)
    {
        cin>>b;
        yao[i]=b-yao[i];
    }
    for(int i=2; i<=a; i++)
    {
        cin>>gai[i].first>>gai[i].second;
    }
    for(int i=a; i>1; i--)
    {
        yao[gai[i].first]+=yao[i]>0?1LL*yao[i]*gai[i].second:yao[i];
    }
    yao[1]>0?cout<<"NO":cout<<"YES";
}

网址:这一题

小结:

**此类题目较难。**

T6 Mice and Holes

题意:

有几个老鼠和几个洞,一个洞里可以有指定的老鼠,问这么安排才能使老鼠跑的路最短.

解法:

暴力递归.

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll INF = 0x3f3f3f3f3f3f3f;
const int Max = 5005;
ll mm[Max];
pair<ll, int> h[Max];
ll sum[Max], dp[2][Max];
struct line
{
    ll val[Max];
    int id[Max], l, r;
    void init()
    {
        l = 0;
        r = 0;
    }
    void push(ll v, int i)
    {
        while (l < r && v < val[r - 1])
            r--;
        val[r] = v;
        id[r] = i;
        r++;
    }
    ll front()
    {
        return val[l];
    }
    void nn(int i)
    {
        while (l < r && id[l] <= i)
            l++;
    }
} qq;
int main()
{
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        cin >> mm[i];
    }
    int tot = 0;
    for (int i = 1; i <= m; i++)
    {
        cin >> h[i].first;
        cin >> h[i].second;
        tot += h[i].second;
    }
    if (tot < n)
    {
        cout << -1 << endl;
        return 0;
    }
    sort(mm + 1, mm + n + 1);
    sort(h + 1, h + m + 1);
    for (int i = 0; i < Max; i++)
    {
        dp[0][i] = dp[1][i] = INF;
    }
    int xx = 0, zz = 1;
    dp[xx][0] = 0;
    dp[zz][0] = 0;
    for (int i = 1; i <= m; i++)
    {
        swap(xx, zz);
        for (int j = 1; j <= n; j++)
        {
            sum[j] = sum[j - 1] + abs(h[i].first - mm[j]);
        }
        qq.init();
        for (int j = 0; j <= n; j++)
        {
            qq.push(dp[zz][j] - sum[j], j);
            dp[xx][j] = qq.front() + sum[j];
            qq.nn(j - h[i].second);
        }
    }
    cout << dp[xx][n] << endl;
    return 0;
}

网址:这一题

小结:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值