Mountain_lovers

愿一生努力,愿一生被爱

  • 主页
  • 随笔
  • 算法练习
所有文章 友链 关于我

Mountain_lovers

愿一生努力,愿一生被爱

  • 主页
  • 随笔
  • 算法练习

CSP-201612

2018-03-15

201612-3-权限查询

题目链接

http://118.190.20.162/view.page?gpid=T50

题目大意

题目太蛋疼。。。直接看吧。。。

思路

没有任何思路。。考虑好数据结构怎么设计以后就可以直接大模拟了。。
纯粹为了记录我这伟大的200+行代码。。

代码

CSP-201612-3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
struct Category{
char cate_name[33];
int cate_level;
}category[101];
int cate_num;
struct Role{
char role_name[33];
int pri_num;
int pri_index[11];
int pri_level[11];
}role[101];
int role_num;
struct User{
char user_name[33];
int role_num;
int role_index[11];
}user[101];
int user_num;

int find_cate(char *pri)
{
for (int i=1;i<=cate_num;i++)
{
if (strcmp(pri,category[i].cate_name) == 0) return i;
}
return -1;
}

int find_role(char *roname)
{
for (int i=1;i<=role_num;i++)
{
if (strcmp(roname,role[i].role_name) == 0) return i;
}
return -1;
}

int find_user(char *username)
{
for (int i=1;i<=user_num;i++)
{
if (strcmp(username,user[i].user_name) == 0) return i;
}
return -1;
}
int main()
{
scanf("%d",&cate_num);
for (int i=1;i<=cate_num;i++)
{
char cate[50];
scanf("%s",cate);
int cate_len=strlen(cate);
int p=0;
while (p<cate_len)
{
if (cate[p] == ':') break;
p++;
}
if (p == cate_len)
{
category[i].cate_level=-1;
for (p=0;p<cate_len;p++) category[i].cate_name[p]=cate[p];
category[i].cate_name[strlen(category[i].cate_name)]='\0';
}
else
{
int x=0;
for (int pp=p+1;pp<cate_len;pp++) x=x*10+(cate[pp]-'0');
category[i].cate_level=x;
for (int pp=0;pp<p;pp++) category[i].cate_name[pp]=cate[pp];
category[i].cate_name[strlen(category[i].cate_name)]='\0';
}
}
/* printf("---------------------------\n");
for (int i=1;i<=cate_num;i++)
{
printf("%s:%d\n",category[i].cate_name,category[i].cate_level);

}
printf("---------------------------\n");*/
scanf("%d",&role_num);
for (int i=1;i<=role_num;i++)
{
char rolename[50];
int pri_num;
scanf("%s%d",rolename,&pri_num);

int len=strlen(rolename);
for (int p=0;p<len;p++) role[i].role_name[p]=rolename[p];
role[i].role_name[len]='\0';

role[i].pri_num=pri_num;

for (int j=1;j<=pri_num;j++)
{
char pri[50];
scanf("%s",pri);
len=strlen(pri);
int p=0;
while (p<len)
{
if (pri[p] == ':') break;
p++;
}
if (p == len)
{
role[i].pri_level[j]=-1;
role[i].pri_index[j]=find_cate(pri);
}
else
{
int x=0;
for (int pp=p+1;pp<len;pp++) x=x*10+(pri[pp]-'0');
role[i].pri_level[j]=x;
pri[p]='\0';
role[i].pri_index[j]=find_cate(pri);
}
}
}
/* printf("---------------------------\n");
for (int i=1;i<=role_num;i++)
{
printf("%s %d ",role[i].role_name,role[i].pri_num);
for (int j=1;j<=role[i].pri_num;j++)
printf("%d:%d ",role[i].pri_index[j],role[i].pri_level[j]);
printf("\n");

}
printf("---------------------------\n");*/
scanf("%d",&user_num);
for (int i=1;i<=user_num;i++)
{
char username[50];
int ro_num;
scanf("%s%d",username,&ro_num);
int len=strlen(username);
for (int p=0;p<len;p++) user[i].user_name[p]=username[p];
user[i].user_name[len]='\0';
user[i].role_num=ro_num;
for (int j=1;j<=ro_num;j++)
{
char roname[50];
scanf("%s",roname);
user[i].role_index[j]=find_role(roname);
}
}
/* printf("---------------------------\n");
for (int i=1;i<=user_num;i++)
{
printf("%s %d ",user[i].user_name,user[i].role_num);
for (int j=1;j<=user[i].role_num;j++)
printf("%d ",user[i].role_index[j]);
printf("\n");
}
printf("---------------------------\n");*/

int Q;
scanf("%d",&Q);
while (Q--)
{
int flag=0;
char username[55],pri[55];
scanf("%s%s",username,pri);
int pri_level=-1;
int p=0,len=strlen(pri);
while (p<len)
{
if (pri[p] == ':') break;
p++;
}
if (p != len)
{
pri_level=0;
for (int pp=p+1;pp<len;pp++) pri_level=pri_level*10+(pri[pp]-'0');
pri[p]='\0';
}
int user_index=find_user(username);
int cate_index=find_cate(pri);
int cate_level=-1;
for (int i=1;i<=user[user_index].role_num && flag!=1;i++)
{
for (int j=1;j<=role[user[user_index].role_index[i]].pri_num && flag!=1;j++)
{
if (role[user[user_index].role_index[i]].pri_index[j] == cate_index)
{
if (category[cate_index].cate_level == -1) {flag=1; break;}
if (pri_level == -1)
{
flag=-1;
cate_level=max(cate_level,role[user[user_index].role_index[i]].pri_level[j]);
continue;
}
if (pri_level <= role[user[user_index].role_index[i]].pri_level[j]) {flag=1; break;}
}
}
}
if (flag == 1) printf("true\n");
else
if (flag == 0) printf("false\n");
else
if (flag == -1) printf("%d\n",cate_level);
}
return 0;
}

压缩编码

题目链接

http://118.190.20.162/view.page?gpid=T49

题目大意

求最短的满足字典序的编码比特数。

思路

收到题目的干扰。本以为是哈夫曼编码的变形,但是看了网上的题解以后,原来是一个DP。
因为需要保证字典序,所以ABCD……是不能颠倒顺序的。所以类似于石子合并,相邻的合并,求最小代价。其中的内在原因是这样的,首先保证字典序,然后在这个场景下,每合并一次就是相当于增加一层,所以代价是类计算的,所以和石子合并的移动一样。
dp[i][j]表示合并第i堆到第j堆的最小代价。
状态转移方程:dp[i][j]=min{dp[i][k],dp[k+1][j]}+sum[j]-sum[i-1]
sum[i]表示前i堆的总代价。
不得不说。。这个dp的代码不太好写。。。

代码

CSP-201612-4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[1005][1005];
int main()
{
int pinshu[1005];
int sum[1005];
memset(sum,0,sizeof(sum));
int N;
scanf("%d",&N);
for (int i=1;i<=N;i++)
{
scanf("%d",&pinshu[i]);
sum[i]=sum[i-1]+pinshu[i];
}
for (int i=1;i<=N;i++)
for (int j=1;j<=N;j++)
if (i == j) dp[i][j]=0;
else dp[i][j]=1<<20;
for (int v=2;v<=N;v++)
{
for (int i=1;i<=N-v+1;i++)
{
int j=i+v-1;
dp[i][j]=1<<30;
for (int k=i;k<=j-1;k++)
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]);
dp[i][j]+=sum[j]-sum[i-1];
}
}
printf("%d\n",dp[1][N]);
return 0;
}

后记

这几天没有每天都做算法练习。。作业有点多,近世代数有点凉。。
CSP加油~

赏

谢谢你请我吃糖果

支付宝
  • 算法练习
  • CSP
  • DP
  • 模拟

扫一扫,分享到微信

微信分享二维码
WISH LIST of College Life
数据的机器级表示与处理Ⅰ
Like Issue Page
No Comment Yet
Login with GitHub
Styling with Markdown is supported
Powered by Gitment
© 2018 Mountain_lovers
Hexo Theme Yilia by Litten
  • 所有文章
  • 友链
  • 关于我

tag:

  • 随笔
  • 算法练习
  • CSP
  • DP
  • 模拟
  • HDU
  • 背包DP
  • 计算机组成原理
  • 搜索
  • 区间DP
  • 前端
  • 技术支持
  • 状态压缩
  • ICS-Homework

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • DataLab

    2018-04-18

    #计算机组成原理

  • PC^2配置记录

    2018-04-12

    #技术支持

  • 中美贸易战引发的联想

    2018-04-04

    #随笔

  • WISH LIST of College Life

    2018-03-27

    #随笔

  • CSP-201612

    2018-03-15

    #算法练习#CSP#DP#模拟

  • 数据的机器级表示与处理Ⅰ

    2018-03-12

    #ICS-Homework

  • winter is coming

    2018-03-11

    #随笔

  • HDU-4562

    2018-03-10

    #算法练习#DP#HDU

  • 纪念堕落的一天

    2018-03-08

    #随笔

  • HDU-4545

    2018-03-07

    #算法练习#模拟#HDU

  • HDU-4455

    2018-03-06

    #算法练习#DP#HDU

  • HDU-1171

    2018-03-06

    #算法练习#DP#HDU#背包DP

  • HDU-4540

    2018-03-05

    #算法练习#DP#HDU

  • HDU-4433

    2018-03-04

    #算法练习#DP#HDU

  • HDU-1078

    2018-03-04

    #算法练习#DP#HDU#搜索

  • HDU-4055

    2018-03-03

    #算法练习#HDU#区间DP

  • HDU-4283

    2018-03-02

    #算法练习#HDU#区间DP

  • HDU-1072

    2018-03-01

    #算法练习#HDU#搜索

  • HDU-4634

    2018-03-01

    #算法练习#HDU#搜索#状态压缩

  • 2018年1月28日

    2018-01-28

    #随笔

  • Hexo+Github搭建博客

    2018-01-27

    #前端

  • Hello World

    2018-01-27

  • AddOne
  • 陆大佬
  • 赵神
  • 板师傅
  • KarlRixon
  • Foxwest
曾经的夜猫子🐱
正在养老的老年人,身体最重要

想法很多的程序猿💻
想通过computer让生活更简单

兴趣很杂的大学狗📚
羽毛球爱好者,不玩游戏星人,电影院独狼选手

多愁善感的男孩纸😳
喜欢一个人