“联想杯”程序设计竞赛划水赛后

暨第三届上理程序设计竞赛赛后反思

给能动丢脸了,给能动丢脸了,给能动丢脸了。


A. Archmage

签到题,我居然没做出来,原因是:没看到 $x+y\le n$这个条件,我枯了,导致怎么想也想不出来,答案就是$\min(m,\lfloor \frac{n+(m-1)\cdot y}{x} \rfloor)$,我菜死了。

B. Bamboo Leaf Rhapsody

签到题,C语言课后习题难度

C. Cheat Sheet

签到题,C语言课后习题难度

D. Disaster Recovery

并査集写成fa[x]==find(fa[x])了,我人傻了

另外,边权按照pair<max(x,y),min(x,y)>排序,我菜死了

image-20200530215431137

H. Hay Mower

赛时A掉了,不过是用的简单的模拟,也属于签到题范围吧

image-20200530215633591

L. Lottery Tickets

image-20200530215802161

首先只需要判断最后两位数即可,按照00,20,12,32,40,24,44,52,60,16,36,64,56,72,76,80,28,84,48,68,88,92,96这样排列最后两位,选前面的数一定比选后面的数更优,因此只需要挨个判断有没有这些数就行了,除此之外,还需要特判 只含有0、只有一个4、只有一个8 的情况,细节比较多,我菜死了

code
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
int _,a[10];
int biao[23]={00,20,12,32,40,24,44,52,60,16,36,64,56,72,76,80,28,84,48,68,88,92,96};

inline void print(){
for(int i=9;i>=0;i--){
for(int j=1;j<=a[i];j++){
printf("%d",i);
}
}
}

int main(){
//freopen("test.in","r",stdin);
for(scanf("%d",&_);_;_--){
int tot=0;
rep(i,0,9){
read(a[i]);
tot+=a[i];
}
if(tot==0){
printf("-1");
continue;
}
if(tot>0&&tot==a[0]){
printf("0\n");
continue;
}
bool f=false;
rep(i,0,22){
int t1=biao[i]/10,t2=biao[i]%10;
if(t1==t2){
if(a[t1]>1){
f=true;
a[t1]-=2;
print();
printf("%d%d\n",t1,t2);
break;
}
}else{
if(a[t1]&&a[t2]){
f=true;
a[t1]--,a[t2]--;
print();
printf("%d%d\n",t1,t2);
break;
}
}
}
if(!f){
if(a[8]) printf("8\n");
else if(a[4]) printf("4\n");
else if(a[0]) printf("0\n");
else printf("-1\n");
}
}
return 0;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!