广州集训 Day1-2(Homework)
//后悔在广州玩的太嗨了 现在要疯狂补blog...
// 含code
Day1
https://www.luogu.org/problem/show?pid=2201
https://www.luogu.org/problem/show?pid=2789
https://www.luogu.org/problem/show?pid=1213
solution:
模拟。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int p[9],c[9]; 6 bool check(){ 7 if((p[1]+p[3]+p[5]+p[7]+p[9])%4==c[5]&&(p[5]+p[7]+p[8]+p[9])%4==c[8]&&(p[6]+p[8]+p[9])%4==c[9]) 8 return true; 9 return false; 10 } 11 int main(){ 12 for(int i=1;i<=9;i++) { 13 cin>>c[i]; 14 c[i]=(12-c[i])/3; 15 } 16 for(p[1]=0;p[1]<4;p[1]++) 17 for(p[2]=0;p[2]<4;p[2]++) 18 for(p[3]=0;p[3]<4;p[3]++){ 19 p[4]=c[1]-p[1]-p[2]; 20 p[5]=c[2]-p[1]-p[2]-p[3]; 21 p[6]=c[3]-p[2]-p[3]; 22 p[7]=c[4]-p[1]-p[4]-p[5]; 23 p[8]=c[7]-p[4]-p[7]; 24 p[9]=c[6]-p[3]-p[5]-p[6]; 25 for(int i=3;i<=9;i++) p[i]=(p[i]+16)%4; 26 if(check()){ 27 bool pass=0; 28 for(int i=1;i<=9;i++) 29 while(p[i]!=0){ 30 if(pass) cout<<" "; 31 cout<<i; 32 p[i]--; 33 pass=1; 34 } 35 return 0; 36 } 37 } 38 return 0; 39 }
https://www.luogu.org/problem/show?pid=2759
solution:
二分。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cmath> 2 #include<cstdio> 3 #define ll long long 4 #ifdef WIN32 5 #define LL "%I64d" 6 #else 7 #define LL "%lld" 8 #endif 9 using namespace std; 10 ll l=1,r=2000000000,mid; 11 ll n,len; 12 int main(){ 13 scanf("%d",&n); 14 while(l<r) { 15 mid=(l+r)>>1; 16 len=(mid*log(mid))/log(10)+1; 17 if(len<n) l=mid+1; 18 else r=mid; 19 } 20 printf(LL,l); 21 return 0; 22 }
https://www.luogu.org/problem/show?pid=2343
https://www.luogu.org/problem/show?pid=3718
solution:
二分。(最小的最大,最大的最小)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<stdio.h> 3 #include<iostream> 4 using namespace std; 5 string x; 6 char ch[5]={'N','F'}; 7 int n,k; 8 int cnt=0; 9 int ll=0,rr=0,cnt_mid=0,con=0; 10 void over(){ 11 printf("1\n"); 12 return ; 13 } 14 int main(){ 15 scanf("%d%d",&n,&k);cin>>x; 16 for(int i=0;i<n;i++) if(x[i]==ch[i%2]) cnt++; 17 if(cnt<=k||n-cnt<=k) {over();return 0;} 18 int l=2,r=n/k+1; 19 int mid=(l+r)>>1; 20 while(l<=r){ 21 mid=(l+r)>>1;cnt_mid=0; 22 for(rr=0,ll=0,con=0;rr<n;rr++){ 23 if(x[ll]==x[rr]) con++; 24 else ll=rr,con=1; 25 if(mid<con) ll=rr+1,con=0,cnt_mid++; 26 } 27 if(cnt_mid<=k) r=mid-1; 28 else l=mid+1; 29 } 30 printf("%d",l); 31 return 0; 32 }
https://www.luogu.org/problem/show?pid=1717
solution:
贪心+优先队列。
感觉枚举也可以过,数据很小...
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<queue> 3 #define Max(a,b) (a>b?a:b) 4 #define MAXN 30 5 using namespace std; 6 int n,h,cx=0; 7 int ans=0; 8 int d[MAXN],t[MAXN]; 9 struct data{ 10 int f,num; 11 bool operator <(data x)const{return f<x.f;} 12 }a[MAXN]; 13 priority_queue<data>q; 14 int main(){ 15 scanf("%d%d",&n,&h);h*=12; 16 for(int i=1;i<=n;i++) {scanf("%d",&a[i].f);a[i].num=i;} 17 for(int i=1;i<=n;i++) scanf("%d",&d[i]); 18 for(int i=1;i<n;i++) scanf("%d",&t[i]); 19 for(int i=1;i<=n;i++){ 20 h-=t[i-1];cx=0; 21 while(!q.empty()) q.pop(); 22 for(int j=1;j<=i;j++) q.push(a[j]); 23 for(int j=1;j<=h;j++) { 24 data x;x=q.top(); 25 if(x.f>0) cx+=x.f; 26 x.f-=d[x.num]; 27 q.pop();q.push(x); 28 } 29 ans=Max(ans,cx); 30 } 31 printf("%d",ans); 32 return 0; 33 }
Day 2
https://www.luogu.org/problem/show?pid=2672
https://www.luogu.org/problem/show?pid=1631
https://www.luogu.org/problem/show?pid=1886
https://www.luogu.org/problem/show?pid=2024
https://www.luogu.org/problem/show?pid=2574
https://www.luogu.org/problem/show?pid=2073
https://www.luogu.org/problem/show?pid=1558
//相信日后会补上的
Day1 模拟+各种奇怪算法
Day2 数据结构