2019中山纪念中学夏令营-Day12[JZOJ]

Begin

(题目的排序方式:题号)

每期新姿势:(今天推荐一位巨佬)Cefola-Kiroxs

推荐知识:namespace的用法(本赛我的代码中将用到)

2019.08.12【NOIP普及组】模拟赛C组

不用看了,这几天的题目luogu上都找不到原题

第1题 【2307. 选择

 

 

题目描述

 

输入

输出

 

样例输入

样例输出

 

数据范围限制

 

提示

【样例解释】
样例一:L = 1, R = 3 样例二:L = 2, R = 5 

这道题就只用维护一下前缀和就好了。

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 }
choose

 

 

第2题 2303.作业

 

题目描述

 

 

 

输入

输出

 

 

 

样例输入

5 10
3 4 6 100 1 

样例输出

60

 

 

 

数据范围限制


 

 

 

提示

 

 

 思路:

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 }
homework

 

 

第3题 【2304.光芒】

 

题目描述

 

输入

输出

 

样例输入

5
1 1 0 1 1

样例输出

3
 

数据范围限制

 

提示

按动 1、4 、5 号开关

 

 本题思路:

对于任何正整数,它的约数一定小于等于它本身。

所以我们就可以从后往前枚举灯,这样不会对已经处理过的灯产生影响.

此外,本题时间还卡得特别死,我用到的算法是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 }
light

 

 

 

第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 }
maze(妹子)

 超级好看的背景图:

End

 

posted @ 2019-08-12 21:48  XYYXP  阅读(129)  评论(0编辑  收藏  举报