标签: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 }
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题
标签:while else 大于 tar i++ nod eof display 线段树
原文地址:http://www.cnblogs.com/wang-ya-wei/p/6659649.html