中间数
实现
#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;
}