正睿 2018 普及组5连测 Day2

前言:这一周算比较良心吧...

T1:

一个比较简单的模拟题,所以才更要注重细节啊......

需要注意的一点,求两个矩形相交的面积

设矩形1左下角点坐标为(x1,y1)右上角点坐标为(x2,y2)

设矩形2左下角点坐标为(x3,y3)右上角点坐标为(x4,y4)

记minx=max(x1,x3),miny=max(y1,y3),maxx=min(x2,x4),maxy=min(y2,y4)

矩形1,2相交的条件是minx<maxx并且miny<maxy

满足则相交面积为(maxx-minx)*(maxy-miny);

其他就没什么了,模拟一定要注意细节,稳住心态,忌焦忌躁,可以现在纸上列出需要执行的事项,一项项执行,心态心态心态!

上代码:

 1 #include<bits/stdc++.h>
 2 #define maxn 2005
 3 typedef long long ll;
 4 using namespace std;
 5 struct node{
 6     ll p,x,y;
 7     ll w;
 8     ll h;
 9     int id;
10 }nd[maxn];
11 bool cmp(node a,node b){
12     return a.p>b.p;
13 }
14 bool vis[maxn];
15 int n,a,st[maxn],top=0,a1,a2,a3,a4;
16 ll check(ll x,ll y,ll w,ll h,ll xx,ll yy,ll ww,ll hh){
17     ll s;
18     ll minx=max(x-w,xx-ww);
19     ll miny=max(y-h,yy-hh);
20     ll maxx=min(x+w,xx+ww);
21     ll maxy=min(y+h,yy+hh);
22     if(minx<maxx&&miny<maxy) s=(maxx-minx)*(maxy-miny);//即使为负也没什么关系 
23     else s=0;
24     
25     return s;
26 }
27 void init(){
28     scanf("%d",&n);
29     int pos=0;
30     int tt=n;//防O2优化
31     for(int i=1;i<=tt;i++){
32         scanf("%lld",&a);
33         int t=a/100000;
34         if(t<6){
35         scanf("%d%d%d%d",&a1,&a2,&a3,&a4);    
36         continue;
37         }
38         ++pos;
39         scanf("%lld%lld%lld%lld",&nd[pos].x,&nd[pos].y,&nd[pos].w,&nd[pos].h);//注意这里是半长半高 
40         nd[pos].p=a;
41         nd[pos].id=i;
42     }
43     int poss=1;
44     int cnt=pos;
45     sort(nd+1,nd+pos+1,cmp);
46     while(cnt){
47         cnt--;
48         while(vis[nd[poss].id]&&poss<=pos) poss++;
49         vis[nd[poss].id]=1;
50         st[++top]=nd[poss].id;
51         ll x=nd[poss].x,y=nd[poss].y,w=nd[poss].w,h=nd[poss].h;
52         poss++;
53         for(int i=poss;i<=pos;i++){
54             if(!vis[nd[i].id]){
55                 ll xx=nd[i].x,yy=nd[i].y,ww=nd[i].w,hh=nd[i].h;
56                 ll cd=check(x,y,w,h,xx,yy,ww,hh);
57                 ll s=(w*2)*(h*2),ss=(ww*2)*(hh*2);
58                 ll bin=s+ss-cd,jiao=cd;
59                 if((2*jiao)>bin){
60                     vis[nd[i].id]=1;cnt--;
61                 }
62             }
63         }
64     }
65     sort(st+1,st+top+1);
66     for(int i=1;i<=top;i++) printf("%d ",st[i]);
67 }
68 int main(){
69     init();
70     
71     return 0;
72 }

T2:

比较简单的dp题(考试时人工记录了每个字母对应的情况,可以冷静下用电脑计入快一些)

设状态dp[i][0/1]表示前i个电码是否以'Z'结尾表示的种数

为了使不出现‘ZR’两个字符,只在匹配到R的时候不计入dp[i-1][1]即可

转移方程:if(j==26) dp[pos-1][1]=(dp[pos-1][1]+dp[i-1][0]+dp[i-1][1])%mod;

else if(j!=18) dp[pos-1][0]=(dp[pos-1][0]+dp[i-1][0]+dp[i-1][1])%mod

else dp[pos-1][0]=(dp[pos-1][0]+dp[i-1][0])%mod;//注:pos-1为当前匹配到的位置

上代码:

 1 #include<bits/stdc++.h>
 2 #define maxn 1000005
 3 using namespace std;
 4 typedef long long ll;
 5 const ll mod=1e9+7;
 6 ll dp[maxn][2];
 7 char mp[30][7];
 8 char s[maxn];
 9 void ready(){
10     mp[1][1]='0',mp[1][2]='1',mp[2][1]='1',mp[2][2]='0',mp[2][3]='0',mp[2][4]='0',mp[3][1]='1',mp[3][2]='0',mp[3][3]='1',mp[3][4]='0',mp[4][1]='1',mp[4][2]='0',mp[4][3]='0',mp[5][1]='0',mp[6][1]='0',mp[6][2]='0',mp[6][3]='1',mp[6][4]='0',mp[7][1]='1',mp[7][2]='1',mp[7][3]='0',mp[8][1]='0',mp[8][2]='0',mp[8][3]='0',mp[8][4]='0',mp[9][1]='0',mp[9][2]='0',mp[10][1]='0',mp[10][2]='1',mp[10][3]='1',mp[10][4]='1',mp[11][1]='1';
11     mp[11][2]='0',mp[11][3]='1',mp[12][1]='0',mp[12][2]='1',mp[12][3]='0',mp[12][4]='0',mp[13][1]='1',mp[13][2]='1',mp[14][1]='1',mp[14][2]='0',mp[15][1]='1',mp[15][2]='1',mp[15][3]='1',mp[16][1]='0',mp[16][2]='1',mp[16][3]='1',mp[16][4]='0',mp[17][1]='1',mp[17][2]='1',mp[17][3]='0',mp[17][4]='1',mp[18][1]='0',mp[18][2]='1',mp[18][3]='0',mp[19][1]='0',mp[19][2]='0',mp[19][3]='0',mp[20][1]='1',mp[21][1]='0',mp[21][2]='0',mp[21][3]='1',mp[22][1]='0',mp[22][2]='0',mp[22][3]='0',mp[22][4]='1',mp[23][1]='0',mp[23][2]='1',mp[23][3]='1',mp[24][1]='1',mp[24][2]='0',mp[24][3]='0',mp[24][4]='1',mp[25][1]='1',mp[25][2]='0',mp[25][3]='1',mp[25][4]='1',mp[26][1]='1',mp[26][2]='1',mp[26][3]='0',mp[26][4]='0';
12 }
13 void dpp(){
14     int len=strlen(s+1);
15     dp[0][0]=1;int pos;
16     for(int i=1;i<=len;i++){
17         for(int j=1;j<=26;j++){
18             pos=i;
19             bool ok=true;
20             while(mp[j][pos-i+1]){
21                 if(mp[j][pos-i+1]!=s[pos]||pos>len){
22                     ok=false;break;
23                 }
24                 pos++;
25             }
26             if(ok){
27             if(j==26) dp[pos-1][1]=(dp[pos-1][1]+dp[i-1][0]+dp[i-1][1])%mod;
28             else if(j!=18) dp[pos-1][0]=(dp[pos-1][0]+dp[i-1][0]+dp[i-1][1])%mod;    
29             else dp[pos-1][0]=(dp[pos-1][0]+dp[i-1][0])%mod;    
30             }
31         }
32     }
33     printf("%lld",(dp[len][0]+dp[len][1])%mod);
34 }
35 int main(){
36     ready();
37     scanf("%s",s+1);
38     dpp();
39     
40     return 0;
41 } 

T3:(留坑,代码被正睿OJ吞掉了,工作日再来补.....)

T4:

猜你喜欢

转载自www.cnblogs.com/degage/p/9690640.html