2019中山纪念中学夏令营-Day12[JZOJ]
Begin
(题目的排序方式:题号)
每期新姿势:(今天推荐一位巨佬)Cefola-Kiroxs
推荐知识:namespace的用法(本赛我的代码中将用到)
2019.08.12【NOIP普及组】模拟赛C组
不用看了,这几天的题目luogu上都找不到原题
第1题 【2307. 选择】
这道题就只用维护一下前缀和就好了。
令Ci=Ci-1+Ai-Bi;
排序:sort(C,C+n+1);
然后算每两个相邻的C的差的绝对值
然后输出绝对值最小的就可以了;(可以证明其最优性)
代码实现:
1 #include <cstdio> 2 #include <algorithm> 3 #define rr register 4 #define int long long 5 using namespace std; 6 int n,a[2][300005],c[300005]; 7 8 namespace YOUAREJULUO { 9 int abs(int a) 10 { 11 if(a<0) 12 return -a; 13 return a; 14 } 15 int min(int a,int b) 16 { 17 if(a>b) 18 return b; 19 return a; 20 } 21 } 22 23 signed main() 24 { 25 freopen("choose.in","r",stdin); 26 freopen("choose.out","w",stdout); 27 int tmp; 28 scanf("%lld",&n); 29 for(rr int i=1;i<=n;i++) 30 { 31 scanf("%lld",&a[0][i]); 32 } 33 for(rr int i=1;i<=n;i++) 34 { 35 scanf("%lld",&a[1][i]); 36 c[i]=c[i-1]+a[0][i]-a[1][i]; 37 } 38 int Min=(1<<30); 39 sort(c,c+n+1); 40 for(rr int i=1;i<=n;i++) 41 { 42 Min=YOUAREJULUO::min(Min,YOUAREJULUO::abs(c[i]-c[i-1])); 43 } 44 printf("%lld",Min); 45 }
第2题 【2303.作业】
思路:
DP(非常非常水的DP),时间复杂度O(N2)(然而我考试的时候想到的是某个O(N3)的垃圾DP,就TLE+WA了50分)
状态转移方程:
Fi=Min(1<=j<=i)(Fj+sumi-j+2*T)
代码实现:
1 #include <cstdio> 2 #include <cstring> 3 #define int long long 4 #define rr register 5 int T,n,t[2005],sum[2005],f[2005]; 6 int min(int a,int b) 7 { 8 if(a>b) 9 return b; 10 return a; 11 } 12 signed main() 13 { 14 freopen("homework.in","r",stdin); 15 freopen("homework.out","w",stdout); 16 scanf("%lld %lld",&n,&T); 17 memset(f,0x3f3f3f3f,sizeof f); 18 for(rr int i=1;i<=n;i++) 19 { 20 scanf("%lld",&t[i]); 21 sum[i]=sum[i-1]+t[i]; 22 } 23 f[0]=0,f[1]=sum[1]+2*T; 24 for(rr int i=1;i<=n;i++) 25 for(rr int j=0;j<i;j++) 26 f[i]=min(f[i],f[j]+sum[i-j]+2*T); 27 printf("%lld",f[n]); 28 }
第3题 【2304.光芒】
本题思路:
对于任何正整数,它的约数一定小于等于它本身。
所以我们就可以从后往前枚举灯,这样不会对已经处理过的灯产生影响.
此外,本题时间还卡得特别死,我用到的算法是O(N√N)的.
代码实现:
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #define rr register 5 int n,a[100005],ans; 6 signed main() 7 { 8 freopen("light.in","r",stdin); 9 freopen("light.out","w",stdout); 10 scanf("%d",&n); 11 for(rr int i=1;i<=n;i++) 12 scanf("%d",&a[i]); 13 for(rr int i=n;i>=1;i--) 14 { 15 if(a[i]) 16 { 17 ans++; 18 a[i]=false; 19 for(rr int j=1;j<=sqrt(i);j++) 20 { 21 if(i%j==0 && j==sqrt(i)) 22 { 23 a[j]=!a[j]; 24 continue; 25 } 26 if(i%j==0) 27 { 28 a[j]=!a[j]; 29 a[i/j]=!a[i/j]; 30 } 31 } 32 } 33 } 34 printf("%d",ans); 35 }
第4题 【2306.迷宫】
这道题正解好像是dijk,但是BFS可以过,并且写法比dijk简单多了。
(这道题一看就知道是搜索,就不多说了)
这道题值得注意的地方是:用优先队列(STL自带的那玩意)优化。
代码实现:
1 #include <cstdio> 2 #include <queue> 3 #include <algorithm> 4 #include <cstring> 5 #define rr register 6 using namespace std; 7 int n,m,sx,sy,ex,ey,ans=(1<<30); 8 int mx[4]={1,0,0,-1}; 9 int my[4]={0,1,-1,0}; 10 char a[105][105]; 11 bool f[105][105][6]; 12 namespace dalao{ 13 int min(int a,int b) 14 { 15 if(a>b) 16 return b; 17 return a; 18 } 19 } 20 struct state{ 21 int x,y,t,O2; 22 bool operator < (const state &tmp) const{ 23 return t>tmp.t; 24 } 25 }st; 26 priority_queue <state> heap; 27 inline void bfs() 28 { 29 while(!heap.empty()) 30 { 31 state u=heap.top(); 32 heap.pop(); 33 for(rr int i=0;i<4;i++) 34 { 35 state v; 36 v.x=u.x+mx[i]; 37 v.y=u.y+my[i]; 38 v.O2=u.O2; 39 v.t=u.t+1; 40 if(v.x<1 || v.y<1 || v.x>n || v.y>m) 41 continue; 42 if(a[v.x][v.y]=='#') 43 { 44 if(v.O2) { 45 v.O2--;v.t++; 46 } 47 else 48 continue; 49 } 50 if(a[v.x][v.y]=='B') 51 { 52 if(v.O2<5) v.O2++; 53 } 54 if(a[v.x][v.y]=='P') 55 v.t--; 56 if(f[v.x][v.y][v.O2]) 57 continue; 58 f[v.x][v.y][v.O2]=true; 59 if(a[v.x][v.y]=='T') 60 ans=dalao::min(ans,v.t); 61 heap.push(v); 62 } 63 } 64 } 65 int main() 66 { 67 freopen("maze.in","r",stdin); 68 freopen("maze.out","w",stdout); 69 int T; 70 scanf("%d",&T); 71 while(T--) 72 { 73 memset(f,false,sizeof f); 74 memset(a,'\0',sizeof a); 75 ans=(1<<30); 76 scanf("%d %d",&n,&m); 77 for(rr int i=1;i<=n;i++) 78 for(rr int j=1;j<=m;j++) 79 { 80 scanf(" %c",&a[i][j]); 81 if(a[i][j]=='S') 82 { 83 st.x=i; 84 st.y=j; 85 st.t=0; 86 st.O2=0; 87 } 88 } 89 heap.push(st); 90 bfs(); 91 if(ans==(1<<30)) 92 ans=-1; 93 printf("%d\n",ans); 94 } 95 }
超级好看的背景图:
End