首页 > 代码库 > 3.31
3.31
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 }
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 }
D题
E题
F题
G题
H题
I题
J题
K题
3.31
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。