csp201612

中间数

实现

#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int n;
int a[N];
int main()
{
    
    
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
    
    
        scanf("%d",&a[i]);
    }
    for(int i=0;i<n;i++)
    {
    
    
        int up = 0;
        int down = 0;
        for(int j=0;j<n;j++)
        {
    
    
            if(a[j]>a[i]) up++;
            else if(a[j]<a[i]) down++;

        }
            if(up==down)
            {
    
    
                printf("%d",a[i]);
                return 0;
            }
    }
    printf("-1");
}

工资计算

实现

由于是整百的数,数据范围可以枚举

#include <bits/stdc++.h>
using namespace std;
int L;
int get(int k){
    
    
    if(k <= 3500) return k;

    int a[] = {
    
    0, 1500, 4500, 9000, 35000, 55000, 80000, 1000000};
    double b[] = {
    
    0, 0.03, 0.1, 0.2, 0.25, 0.3, 0.35, 0.45};

    int tax = k - 3500, sum = 0;
    for(int i = 1; i <= 7; i ++){
    
    
        if(tax >= a[i]) sum += (a[i] - a[i - 1]) * b[i];
        else{
    
    
            sum += (tax - a[i - 1]) * b[i];
            break;
        }
    }
    return k - sum;
}


int main(){
    
    
    cin >> L;
    for(int i = 0; ; i += 100){
    
    
        if(get(i) == L){
    
    
            cout << i << endl;
            break;
        }
    }
}

权限查询

思路

来自acwing-yxc

  • 使用unordered_map<string,set< p >>存储人名/角色名和权限的对应关系
  • 结构体P的构造函数可以方便的进行初始化

实现

#include<bits/stdc++.h>
using namespace std;
int n;
struct P
{
    
    
    string name;
    mutable int level;
    P(string str)
    {
    
    
        int k = str.find(":");
        if (k == -1) name = str, level = -1;
        else
        {
    
    
            name = str.substr(0, k);
            level = stoi(str.substr(k + 1));
        }
    }
    bool operator< (const P& t) const
    {
    
    
        return name < t.name;
    }
};
unordered_map<string,set<P>> role,person;
int main()
{
    
    
    cin>>n;
    string name;
    int cnt;
    string str;
    while(n--)
    {
    
    
        cin>>str;
    }
    cin>>n;
    while(n--)
    {
    
    
        cin>>name>>cnt;
        auto &r = role[name];
        while(cnt--)
        {
    
    
            cin>>str;
            P t(str);
            if(t.level==-1) r.insert(t);
            else
            {
    
    
                if(!r.count(t)) r.insert(t);
                else 
                {
    
    
                    auto it = r.find(t);
                    it->level = max(it->level,t.level); 
                }
            }
        }
    }
    cin>>n;
    while(n--)
    {
    
    
        cin>>name>>cnt;
        auto &p = person[name];
        while(cnt--)
        {
    
    
            cin>>str;
            for(auto& t:role[str])
            {
    
    
                if(t.level == -1) p.insert(t);
                else
                {
    
    
                    if(!p.count(t)) p.insert(t);
                    else 
                    {
    
    
                        auto it = p.find(t);
                        it->level = max(it->level,t.level);
                    }
                }
            }
        }
    }
    cin>>n;
    while(n--)
    {
    
    
        string user,pr;
        cin>>user>>pr;
        P t(pr);
        auto& p = person[user];
        if(!p.count(t)) puts("false");
        else
        {
    
    
            auto it = p.find(t);
            if(t.level!=-1)
            {
    
    
                if(it->level>=t.level) puts("true");
                else puts("false");
            }
            else
            {
    
    
                if(it->level==-1) puts("true");
                else cout<<it->level<<endl;
            }
        }
    }
}

压缩编码

思路

必须是字典序,相当于按序对两颗树进行合并,所需要花费的值就是两棵树的大小之和。

和线性dp中的石子合并相似,甚至连代码都是一样的(笑

实现

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1010;

int n;
int s[N], f[N][N];

int main()
{
    
    
    cin >> n;
    for (int i = 1; i <= n; i ++ )
    {
    
    
        cin >> s[i];
        s[i] += s[i - 1];
    }
    for (int len = 2; len <= n; len ++ )
        for (int i = 1; i + len - 1 <= n; i ++ )
        {
    
    
            int j = i + len - 1;
            f[i][j] = 1e9;
            for (int k = i; k < j; k ++ )
                f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j] + s[j] - s[i - 1]);
        }
    cout << f[1][n] << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Tracy_yi/article/details/129170551