码迷,mamicode.com
首页 > 其他好文 > 详细

3.31

时间:2017-04-02 19:58:13      阅读:298      评论:0      收藏:0      [点我收藏+]

标签:while   else   大于   tar   i++   nod   eof   display   线段树   

http://codeforces.com/gym/100623/attachments

A题

B题

题意:给你一个长度为w有h个单位宽的广告牌,然后给你长度为 wi 的一个单位宽的广告,问第 i 个最低能放在哪个单位上,如果不存在打印-1.

思路:一道线段树的问题,套用线段树模板就能很简单的解答了。比赛的时候没有想到用线段树真是好心塞啊

技术分享
 1 #include <iostream>
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 const int maxn=200005;
 5 struct node
 6 {
 7     int l,r,cnt;
 8 } a[maxn<<2];
 9 void build(int l,int r,int k,int m)
10 {
11     a[k].l=l,a[k].r=r,a[k].cnt=m;
12     if(l==r)
13         return ;
14     int mid=(l+r)/2;
15     build(l,mid,k<<1,m);
16     build(mid+1,r,k<<1|1,m);
17     return ;
18 }
19 void init(int k,int d)
20 {
21 
22     if(a[k].l==a[k].r)
23     {
24         a[k].cnt=a[k].cnt-d;
25         printf("%d\n",a[k].l);
26         return ;
27     }
28     if(a[k*2].cnt>=d)
29         init(k*2,d);
30     else if(a[k*2+1].cnt>=d)
31         init(k*2+1,d);
32     a[k].cnt=max(a[k*2].cnt,a[k*2+1].cnt);
33     return ;
34 
35 }
36 int main()
37 {
38     freopen("billboard.in","r",stdin);
39     freopen("billboard.out","w",stdout);
40     int n,m,k,x;
41     while(~scanf("%d%d%d",&n,&m,&k))
42     {
43         int p=min(n,k);
44         build(1,p,1,m);
45         for(int i=0; i<k; i++)
46         {
47             scanf("%d",&x);
48             if(a[1].cnt<x)
49                 printf("-1\n");
50             else
51                 init(1,x);
52         }
53     }
54     return 0;
55 }
View Code

C题

题意:给你学生的数量和一间教室的座位的行数和列数,问你如何让学生入座才能使得行的最大值和列的最大值的最小值最大?打印此时入座方式。

思路:简单思维题,细想一下就能知道:当人数大于等于行数和列数的最小值的二倍减一时结果是行数和列数的最小值,否则是如果是偶数结果是人数的一半,若是奇数结果就是人数的一半加一。然后把单字符数组填一下就可以了。

技术分享
 1 #include <iostream>
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 char s[1005][1005];
 5 int main()
 6 {
 7     freopen("class.in","r",stdin);
 8     freopen("class.out","w",stdout);
 9     int n,m,k;
10     while(~scanf("%d%d%d",&k,&n,&m))
11     {
12         memset(s,.,sizeof(s));
13         int x=min(n,m);
14         if(x*2-1<=k)
15         {
16             printf("%d\n",x);
17             for(int i=0; i<x; i++)
18                 s[i][0]=#;
19             for(int i=1; i<x; i++)
20                 s[0][i]=#;
21             k=k-x*2+1;
22             for(int i=1; i<n; i++)
23             {
24                 for(int j=1; j<m; j++)
25                 {
26                     if(k==0)
27                         break;
28                     s[i][j]=#;
29                     k--;
30                 }
31             }
32             if(k>0)
33             {
34                 for(int i=m-1; i>=x; i--)
35                 {
36                     if(k==0)
37                         break;
38                     s[0][i]=#;
39                     k--;
40                 }
41             }
42             if(k>0)
43             {
44                 for(int i=n-1; i>=x; i--)
45                 {
46                     if(k==0)
47                         break;
48                     s[i][0]=#;
49                     k--;
50                 }
51             }
52             for(int i=0; i<n; i++)
53             {
54                 for(int j=0; j<m; j++)
55                     printf("%c",s[i][j]);
56                 printf("\n");
57             }
58         }
59         else
60         {
61             if(k%2==0)
62             {
63                 printf("%d\n",k/2);
64                 for(int i=0; i<k/2; i++)
65                     s[i][0]=#;
66                 k=k-k/2;
67                 for(int j=1; j<k+1; j++)
68                     s[0][j]=#;
69                 for(int i=0; i<n; i++)
70                 {
71                     for(int j=0; j<m; j++)
72                         printf("%c",s[i][j]);
73                     printf("\n");
74                 }
75             }
76             else
77             {
78                 printf("%d\n",k/2+1);
79                 for(int i=0; i<k/2+1; i++)
80                     s[i][0]=#;
81                 for(int j=0; j<k/2+1; j++)
82                     s[0][j]=#;
83                 for(int i=0; i<n; i++)
84                 {
85                     for(int j=0; j<m; j++)
86                         printf("%c",s[i][j]);
87                     printf("\n");
88                 }
89             }
90         }
91     }
92     return 0;
93 }
View Code

D题

E题

F题

G题

H题

I题

J题

K题

3.31

标签:while   else   大于   tar   i++   nod   eof   display   线段树   

原文地址:http://www.cnblogs.com/wang-ya-wei/p/6659649.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!