A - Triangles

记忆化搜索呗。搜索以某三角形为顶的最大面积,注意边界情况。

 1 #include <stdio.h>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 #include <cmath>
 6
 7 using namespace std;
 8 #define lson o<<1
 9 #define rson o<<1|1
10 #define max(a,b) (a)>(b)?(a):(b)
11 #define min(a,b) (a)<(b)?(a):(b)
12 #define INF 200000000
13
14 typedef long long ll;
15 int dp[110][220];
16 char g[110][220];
17 int main(){
18    int n,h,cs=1;
19    while(scanf("%d",&n) && n){
20       for(int i=0;i<n;i++)scanf("%s",g[i]);
21       memset(dp,0,sizeof dp);
22
23       printf("Triangle #%d\n",cs++);
24       if(n==1){
25           printf("The largest triangle area is %d.\n\n",g[0][0]=='#'?0:1);
26           continue;
27       }
28
29       h=0;
30       for(int j=0;j<2*n-1;j++)if(g[0][j]!='#')dp[0][j]=h=1;
31       for(int i=1;i<n;i++){
32          int j;
33          for(j=0;j<2*(n-i);j+=2)if(g[i][j]!='#'){
34             int f=i-1,p=j+1;
35             while(f>=0&&g[f][p]!='#'&&g[f][p+1]!='#')f--,p+=2;
36             dp[i][j]=min(1+dp[i-1][j],i-f);
37             h=max(h,dp[i][j]);
38          }
39       }
40       if(g[n-2][1]!='#'){dp[n-2][1]=1;h=max(h,1);}
41       for(int i=n-3;i>=0;i--){
42           int j;
43           for(j=1;j<2*(n-i)-1;j+=2)if(g[i][j]!='#'){
44              if(j<2)dp[i][j]=1;
45              else{
46              int f=i+1,p=j-1;
47              while(f<n && j<2*(n-f)-1 && g[f][p]!='#' && g[f][p+1]!='#')f++;
48              dp[i][j]=min(1+dp[i+1][j-2],f-i);
49              }
50              h=max(h,dp[i][j]);
51           }
52       }
53       printf("The largest triangle area is %d.\n\n",h*h);
54    }
55    return 0;
56 }

View Code

B - Domino Effect

基本就是最短路问题,权值为正,最后要用 t=(dis[i]+dis[j]+g[i][j])/2.0 计算边上最后一个多米诺倒下的时间。

 1 #include <stdio.h>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 #include <cmath>
 6 #include <queue>
 7
 8 using namespace std;
 9 #define lson o<<1
10 #define rson o<<1|1
11 #define max(a,b) (a)>(b)?(a):(b)
12 #define min(a,b) (a)<(b)?(a):(b)
13 #define INF 20000000000LL
14
15 typedef long long ll;
16 int g[505][505],n,m,vis[505];
17 ll d[505];
18 double t;int x,y;
19 void dijkstra(){
20    for(int i=2;i<=n;i++)d[i]=INF;
21    d[1]=0;
22    for(int i=0;i<n;i++){
23       int u;
24       ll tm=INF;
25       for(int j=1;j<=n;j++)if(!vis[j]&&d[j]<tm){
26          u=j;tm=d[j];
27       }
28       if(tm>=INF)break;
29       vis[u]=1;
30       for(int j=1;j<=n;j++)if(g[u][j]!=-1&&!vis[j])
31           d[j]=min(d[j],g[u][j]+d[u]);
32    }
33    for(int i=1;i<=n;i++){
34       if(t<d[i]){x=i;y=0;t=d[i];}
35       for(int j=1;j<i;j++)if(g[i][j]!=-1){
36          double temp=(g[i][j]+d[i]+d[j])/2.0;
37          if(t<temp){x=j;y=i;t=temp;}
38       }
39
40    }
41 }
42 int main(){
43     int a,b,l,cs=1;
44     while(scanf("%d%d",&n,&m) && n){
45        memset(g,-1,sizeof g);
46        memset(vis,0,sizeof vis);
47        t=0;x=1;y=0;
48        for(int i=0;i<m;i++){
49            scanf("%d%d%d",&a,&b,&l);
50            g[a][b]=g[b][a]=l;
51        }
52        dijkstra();
53        printf("System #%d\n",cs++);
54        if(!y){
55          printf("The last domino falls after %.1lf seconds, at key domino %d.\n\n",t,x);
56        }else{
57          printf("The last domino falls after %.1lf seconds, between key dominoes %d and %d.\n\n",t,x,y);
58        }
59    }
60    return 0;
61 }

View Code

C - Pendulum

代码还比较简短,注意转的时候不能高于x轴

 1 #include <stdio.h>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 #include <cmath>
 6
 7 using namespace std;
 8 #define lson o<<1
 9 #define rson o<<1|1
10 #define max(a,b) (a)>(b)?(a):(b)
11 #define min(a,b) (a)<(b)?(a):(b)
12 #define INF 2000000000
13 #define eps 1e-6
14
15 typedef long long ll;
16 const double pi=acos(-1);
17 struct point{
18    int x,y;
19    point() {}
20    point(int x,int y): x(x),y(y) {}
21    point operator + (const point a){return point(x+a.x,y+a.y);}
22    point operator - (const point a){return point(x-a.x,y-a.y);}
23 }p[505];
24 int n;
25 int dcmp(double x){
26    if(x>eps)return 1;
27    else if(x<-eps)return -1;
28    return 0;
29 }
30 double dist(point c){
31    return sqrt((double)c.x*c.x+(double)c.y*c.y);
32 }
33 double ans;
34 void swing(int o,double l,double ang){
35    double a0=2*pi,dm=0.0;
36    int next=-1;
37    double amax=2*pi;
38    if(dcmp(p[o].y-l)<0)amax=pi+asin(p[o].y/l)-ang;
39    for(int i=1;i<n;i++)if(i!=o){
40       double d=dist(p[i]-p[o]);
41       if(dcmp(d-l)>=0)continue;
42       double a=atan2(p[i].y-p[o].y,p[i].x-p[o].x)-ang;
43       while(a<0)a+=2*pi;
44       if(dcmp(a-amax)>=0)continue;
45       if(dcmp(a-a0)<0||(dcmp(a-a0)==0&&d>dm)){
46          dm=d,a0=a;
47          next=i;
48       }
49    }
50    if(next!=-1){
51        ans+=a0*l;
52        double a=a0+ang;
53        if(a>=2*pi)a-=2*pi;
54        swing(next,l-dm,a);
55    }
56    else if(dcmp(p[o].y-l)<0)ans+=amax*l;
57    else ans=pi*l;
58 }
59
60 int main(){
61    int cs=1;
62    double r;
63    while(scanf("%d%lf",&n,&r) && dcmp(r)){
64       n++;
65       p[0]=point(0,0);
66       for(int i=1;i<n;i++){
67          scanf("%d%d",&p[i].x,&p[i].y);
68          p[i].x=-p[i].x,p[i].y=-p[i].y;
69       }
70       ans=0.0;
71       swing(0,r,0.0);
72       printf("Pendulum #%d\n",cs++);
73       printf("Length of periodic orbit = %.2lf\n\n",ans*2);
74    }
75    return 0;
76 }

View Code

D - The New Villa

这种题应该一看数据规模就知道是bfs可以水过的。

 1 #include <stdio.h>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <algorithm>
 5
 6 #define STA 30000
 7 int q[STA],d[STA],fa[STA],vis[STA],ans[STA];
 8 int to[15][15],sw[15][15];
 9 int n,k,s;
10 int bfs(int st){
11    int l,r;
12    l=r=0;
13    int now=(1<<st)*10+st-1;
14    q[r++]=now;
15    fa[now]=-1;
16    while(l<r){
17       now=q[l++];
18       int room=now%10+1,sta=now/10;
19       if(room==n&&sta==(1<<n))return 1;
20       int next;
21       for(int i=1;i<=n;i++)if(!vis[now-room+i] && to[room][i] && sta&(1<<i)){
22           next=now-room+i;
23           vis[next]=1;
24           d[next]=d[now]+1;
25           fa[next]=now;
26           q[r++]=next;
27       }
28       for(int i=1;i<=n;i++)if(i!=room && sw[room][i]){
29           if(!(sta&(1<<i)) && !vis[(sta|(1<<i))*10+room-1]){
30           next=(sta|(1<<i))*10+room-1;
31           vis[next]=1;
32           d[next]=d[now]+1;
33           fa[next]=now;
34           q[r++]=next;
35           }
36           else if(sta&(1<<i) && !vis[(sta^(1<<i))*10+room-1]){
37           next=(sta^(1<<i))*10+room-1;
38           vis[next]=1;
39           d[next]=d[now]+1;
40           fa[next]=now;
41           q[r++]=next;
42           }
43       }
44    }
45    return 0;
46
47 }
48 int main(){
49 //freopen("input.in","r",stdin);freopen("output.out","w",stdout);
50     int cs=1;
51    while(scanf("%d%d%d",&n,&k,&s) &&n){
52        int x,y;
53        memset(to,0,sizeof to);
54        memset(sw,0,sizeof sw);
55        memset(vis,0,sizeof vis);
56        memset(d,0,sizeof d);
57        while(k--){
58           scanf("%d%d",&x,&y);
59           to[x][y]=to[y][x]=1;
60        }
61        while(s--){
62           scanf("%d%d",&x,&y);
63           sw[x][y]=1;
64        }
65        printf("Villa #%d\n",cs++);
66        if(bfs(1)){
67            int u=(1<<n)*10+n-1,dis;
68            printf("The problem can be solved in %d steps:\n",dis=d[u]);
69            for(int i=0;i<dis;i++){
70               ans[i]=u;
71               u=fa[u];
72            }
73            int lastroom=1,sta0=1<<1,room,sta;
74            for(int i=dis-1;i>=0;i--){
75               room=ans[i]%10+1;sta=ans[i]/10;
76               if(room!=lastroom)printf("- Move to room %d.\n",room);
77               else{
78                  for(int j=1;j<=n;j++)if((sta0&(1<<j))!=(sta&(1<<j))){
79                     if(sta0&(1<<j))printf("- Switch off light in room %d.\n",j);
80                     else printf("- Switch on light in room %d.\n",j);
81                     break;
82                  }
83               }
84               lastroom=room;sta0=sta;
85            }
86            printf("\n");
87
88        }else printf("The problem cannot be solved.\n\n");
89
90    }
91    return 0;
92 }

View Code

E - Parallelepiped Walk

巧妙地转化成坐标旋转的问题,有几个简化代码的技巧

 1 #include <stdio.h>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 #include <cmath>
 6
 7 using namespace std;
 8 #define lson o<<1
 9 #define rson o<<1|1
10 #define max(a,b) (a)>(b)?(a):(b)
11 #define min(a,b) (a)<(b)?(a):(b)
12 #define INF 2000000000
13
14 typedef long long ll;
15 int xx,yy,zz;
16 ll ans;
17 ll dist(int x,int y){
18    return (ll)x*x+(ll)y*y;
19 }
20 void go(int dx,int dy,int x,int y,int z,int x1,int x2,int y1,int y2,int h){
21    if(z==0){
22       ans=min(ans,dist(x-xx,y-yy));
23       return;
24    }
25    if(dx>=0&&dx<2)go(dx+1,dy,x2+z,y,x2-x,x2,x2+h,y1,y2,x2-x1);
26    if(dx<=0&&dx>-2)go(dx-1,dy,x1-z,y,x-x1,x1-h,x1,y1,y2,x2-x1);
27    if(dy>=0&&dy<2)go(dx,dy+1,x,y2+z,y2-y,x1,x2,y2,y2+h,y2-y1);
28    if(dy<=0&&dy>-2)go(dx,dy-1,x,y1-z,y-y1,x1,x2,y1-h,y1,y2-y1);
29 }
30 int main(){
31    int x0,y0,z0,x,y,z;
32    while(~scanf("%d%d%d%d%d%d%d%d%d",&x0,&y0,&z0,&xx,&yy,&zz,&x,&y,&z)){
33       if(xx==0||xx==x0){
34          swap(xx,zz);
35          swap(x0,z0);
36          swap(x,z);
37       }
38       else if(yy==0||yy==y0){
39          swap(yy,zz);
40          swap(y0,z0);
41          swap(y,z);
42       }
43       if(zz==z0){
44          zz=z0-zz;
45          z=z0-z;
46       }
47       ans=INF;
48       go(0,0,x,y,z,0,x0,0,y0,z0);
49       printf("%lld\n",ans);
50    }
51    return 0;
52 }

View Code

F - Decoding Morse Sequences

我的做法是把所有单词的Morse码编进Trie树,在词尾标记访问次数,然后记忆化搜索。

 1 #include <stdio.h>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 #include <cmath>
 6
 7 using namespace std;
 8 #define lson o<<1
 9 #define rson o<<1|1
10 #define max(a,b) (a)>(b)?(a):(b)
11 #define min(a,b) (a)<(b)?(a):(b)
12 #define INF 200000000
13
14 typedef long long ll;
15 int ch[1000010][3],sz;
16 char morse[26][10]
17 ={".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..",
18 "--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
19 char s[10100],word[25],mod[100];
20 ll dp[10100];
21 int t[1000010];
22
23 void insert(char *s){
24    char *p=s;
25    int u=0;
26    for(;*p!='\0';p++){
27        int temp;
28        if(*p=='.')temp=1;
29        else temp=2;
30        if(ch[u][temp]==-1)ch[u][temp]=++sz;
31        u=ch[u][temp];
32    }
33    if(ch[u][0]==-1)ch[u][0]=++sz;
34    u=ch[u][0];
35    t[u]++;
36 }
37 ll dfs(int now){
38    if(dp[now]>=0)return dp[now];
39    ll &ans=dp[now];
40    ans=0;
41    int u=0,flag=1;
42    for(int i=now;s[i];i++){
43       int temp;
44       if(s[i]=='.')temp=1;
45       else temp=2;
46       if(ch[u][temp]==-1)return ans;
47       u=ch[u][temp];
48       if(ch[u][0]!=-1)ans+=t[ch[u][0]]*dfs(i+1);
49    }
50    return ans;
51 }
52 int main(){
53    //freopen("r.in","r",stdin);freopen("r.out","w",stdout);
54    int T;
55    scanf("%d",&T);
56    while(T--){
57       scanf("%s",s);
58       int m;
59       scanf("%d",&m);
60       memset(ch,-1,sizeof ch);
61       memset(t,0,sizeof t);
62       sz=0;
63       for(int i=0;i<m;i++){
64          mod[0]='\0';
65          scanf("%s",word);
66          for(int j=0;word[j];j++)
67             strcat(mod,morse[word[j]-'A']);
68          insert(mod);
69       }
70       memset(dp,-1,sizeof dp);
71       dp[strlen(s)]=1;
72       dfs(0);
73       printf("%lld\n",dp[0]);
74    }
75    return 0;
76 }

View Code

G - Fill the Cisterns!

二分答案,精度0.0005.

 1 #include <stdio.h>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 #include <cmath>
 6
 7 using namespace std;
 8 #define lson o<<1
 9 #define rson o<<1|1
10 #define max(a,b) (a)>(b)?(a):(b)
11 #define min(a,b) (a)<(b)?(a):(b)
12 #define INF 2000000
13 #define eps 5e-4
14
15 typedef long long ll;
16
17 struct cistern{
18     double b,h,s;
19 }c[50010];
20 double v,hmax,hmin;
21 int n;
22
23 int cmp(cistern a,cistern b){return a.b<b.b;}
24
25 int cal(double dh){
26    double vx=0;
27    for(int i=0;i<n&&c[i].b<dh;i++){
28       double t=min(c[i].b+c[i].h,dh);
29       vx+=(t-c[i].b)*c[i].s;
30    }
31    if(vx<v)return -1;
32    if(vx>v)return 1;
33    return 0;
34 }
35 double search(double low,double hi){
36    double mid;
37    while(hi-low>eps){
38       mid=(hi+low)/2.0;
39       if(cal(mid)>=0)hi=mid;
40       else low=mid;
41    }
42    return hi;
43 }
44 int main(){
45     //freopen("r.in","r",stdin);freopen("r.out","w",stdout);
46    int t;
47    scanf("%d",&t);
48    while(t--){
49       scanf("%d",&n);
50       double w,h,vmax;
51       hmax=0;hmin=INF;
52       vmax=0;
53       for(int i=0;i<n;i++){
54          scanf("%lf%lf%lf%lf",&c[i].b,&c[i].h,&w,&h);
55          c[i].s=w*h;
56          hmax=max(hmax,c[i].h+c[i].b);
57          hmin=min(hmin,c[i].b);
58          vmax+=c[i].s*c[i].h;
59       }
60       scanf("%lf",&v);
61       if(vmax<v){
62          printf("OVERFLOW\n");
63          continue;
64       }
65
66       sort(c,c+n,cmp);
67       double dh=search(hmin,hmax);
68       printf("%.2lf\n",dh);
69
70    }
71    return 0;
72 }

View Code

H - Horizontally Visible Segments

线段树染色问题……每次询问一次更新一次,中间hash判重然后加边,最后暴力搜索得到 Triangle 个数。

有个细节是x,y在[0,8000],0<=n<=8000,建立的图应该是稀疏图,用vector存,所以一定要判重的!

  1 #include <stdio.h>
  2 #include <cstdlib>
  3 #include <cstring>
  4 #include <algorithm>
  5 #include <vector>
  6
  7 #define rson o<<1|1
  8 #define lson o<<1
  9 #define H 16000
 10 #define MOD 1403641
 11
 12 using namespace std;
 13
 14 vector <int> g[8010];
 15 int col[16000<<2],y1,y2;
 16
 17 struct segment{
 18    int y1,y2,x;
 19 }seg[8010];
 20 struct Hash{
 21    int va;
 22    Hash *next;
 23    Hash(){va=-1;next=NULL;}
 24 }hash[MOD];
 25 void init(){
 26    for(int i=0;i<MOD;i++){hash[i].va=-1;hash[i].next=NULL;}
 27 }
 28 int exist(int u,int v){
 29    int x=u*10000+v;
 30    if(hash[x%MOD].va==-1){hash[x%MOD].va=x;return 0;}
 31    else{
 32         Hash *u=&hash[x%MOD];
 33         while(u->next!=NULL){
 34            if(u->va==x)return 1;
 35            u=u->next;
 36         }
 37         if(u->va==x)return 1;
 38         u->next=new Hash;
 39         u->next->va=x;u->next->next=NULL;
 40         return 0;
 41    }
 42 }
 43 int cmp(struct segment a,struct segment b){return a.x<b.x;}
 44 void pushdown(int o,int l,int r){
 45     if(col[o]!=-1){
 46        col[rson]=col[lson]=col[o];
 47     }
 48 }
 49 void upd(int o,int l,int r,int u){
 50    if(y1<=l&&y2>=r){
 51       col[o]=u;
 52    }else if(y2>=l&&y1<=r){
 53       int mid=(l+r)>>1;
 54       pushdown(o,l,r);
 55       col[o]=-1;
 56       if(y1<=mid)upd(lson,l,mid,u);
 57       if(y2>mid)upd(rson,mid+1,r,u);
 58    }
 59 }
 60 void que(int o,int l,int r,int v){
 61    int mid=(l+r)/2;
 62    if(y1<=l&&y2>=r){
 63        if(col[o]==-1){
 64           que(lson,l,mid,v);
 65           que(rson,mid+1,r,v);
 66        }else if(col[o]&&!exist(v,col[o])){
 67              g[v].push_back(col[o]);
 68        }
 69    }else if(y2>=l&&y1<=r){
 70        pushdown(o,l,r);
 71        if(y1<=mid)que(lson,l,mid,v);
 72        if(y2>mid)que(rson,mid+1,r,v);
 73     }
 74 }
 75 int main(){
 76     int T,n;
 77     scanf("%d",&T);
 78     while(T--){
 79        scanf("%d",&n);
 80        for(int i=1;i<=n;i++)scanf("%d%d%d",&seg[i].y1,&seg[i].y2,&seg[i].x);
 81        sort(seg+1,seg+n+1,cmp);
 82
 83        for(int i=1;i<=n;i++)g[i].clear();
 84        memset(col,0,sizeof col);
 85        init();
 86        for(int i=1;i<=n;i++){
 87            y1=seg[i].y1*2;y2=seg[i].y2*2;
 88            if(i>1)que(1,0,H,i);
 89            upd(1,0,H,i);
 90        }
 91        int cnt=0;
 92        for(int i=3;i<=n;i++)if(g[i].size()>1)
 93          for(int j=0;j<g[i].size();j++){
 94             int u=g[i][j];
 95             for(int k=0;k<g[u].size();k++)
 96               for(int q=0;q<g[i].size();q++)if(g[i][q]==g[u][k])cnt++;
 97          }
 98
 99        printf("%d\n",cnt);
100     }
101     return 0;
102 }

View Code

I - 2D Nim

按照每个点向四个方向走的最大步数来判断,哈希查找

  1 #include <stdio.h>
  2 #include <cstring>
  3 #include <cstdlib>
  4 #include <algorithm>
  5 #include <cmath>
  6 using namespace std;
  7 #define lson o<<1
  8 #define rson o<<1|1
  9 #define max(a,b) (a)>(b)?(a):(b)
 10 #define min(a,b) (a)<(b)?(a):(b)
 11 #define INF 2000000000
 12 #define M 240
 13
 14 typedef long long ll;
 15 int g[120][120];
 16 int n,m;
 17 struct hash_table{
 18    int v[4];
 19    bool vis;
 20    hash_table* next;
 21    hash_table(){vis=0;next=NULL;}
 22    void init(){
 23       vis=0;
 24       next=NULL;
 25    }
 26    void insert(int *t){
 27       if(!vis){
 28          for(int i=0;i<4;i++)v[i]=t[i];
 29          vis=1;
 30       }
 31       else{
 32          hash_table *u=new hash_table;
 33          u->next=next;
 34          next=u;
 35          u->vis=1;
 36          for(int i=0;i<4;i++)u->v[i]=t[i];
 37       }
 38    }
 39    int search(int *t){
 40        if(vis){
 41           bool flag=1;
 42           for(int i=0;i<4;i++)if(v[i]!=t[i])flag=0;
 43           if(flag){vis=0;return 1;}
 44        }
 45       hash_table* now=next;
 46       while(now!=NULL){
 47         if(now->vis){
 48            bool flag=1;
 49            for(int i=0;i<4;i++)if(now->v[i]!=t[i])flag=0;
 50            if(flag){now->vis=0;return 1;}
 51         }
 52         now=now->next;
 53       }
 54       return 0;
 55    }
 56 }hash[M];
 57 int main(){
 58    // freopen("r.in","r",stdin);freopen("r.out","w",stdout);
 59    int t;
 60    scanf("%d",&t);
 61    while(t--){
 62       int k;
 63       scanf("%d%d%d",&n,&m,&k);
 64       memset(g,0,sizeof g);
 65       for(int i=0;i<M;i++)hash[i].init();
 66       int x,y;
 67       for(int i=0;i<k;i++){
 68          scanf("%d%d",&x,&y);
 69          g[x][y]=1;
 70       }
 71       int tm[4];
 72       for(int i=0;i<n;i++)
 73         for(int j=0;j<m;j++)if(g[i][j]){
 74            int tot=0;
 75            memset(tm,0,sizeof tm);
 76            for(int x=i-1;x>=0&&g[x][j];x--)tm[0]++,tot++;
 77            for(int x=i+1;x<n&&g[x][j];x++)tm[1]++,tot++;
 78            for(int y=j-1;y>=0&&g[i][y];y--)tm[2]++,tot++;
 79            for(int y=j+1;y<m&&g[i][y];y++)tm[3]++,tot++;
 80            sort(tm,tm+4);
 81            hash[tot].insert(tm);
 82         }
 83       memset(g,0,sizeof g);
 84       for(int i=0;i<k;i++){
 85         scanf("%d%d",&x,&y);
 86         g[x][y]=1;
 87       }
 88       bool flag=1;
 89       for(int i=0;i<n;i++)
 90         for(int j=0;j<m;j++)if(g[i][j]){
 91            int tot=0;
 92            memset(tm,0,sizeof tm);
 93            for(int x=i-1;x>=0&&g[x][j];x--)tm[0]++,tot++;
 94            for(int x=i+1;x<n&&g[x][j];x++)tm[1]++,tot++;
 95            for(int y=j-1;y>=0&&g[i][y];y--)tm[2]++,tot++;
 96            for(int y=j+1;y<m&&g[i][y];y++)tm[3]++,tot++;
 97            sort(tm,tm+4);
 98            if(!hash[tot].search(tm)){flag=0;break;}
 99         }
100
101       if(flag)printf("YES\n");
102       else printf("NO\n");
103    }
104    return 0;
105 }

View Code

J - (Your)((Term)((Project)))

细节题了,递归做最保险。

1.skip空格。

2.加号(或无符号默认为加号)后面对应括号去掉。

3.重复的空格去掉。

 1 #include <stdio.h>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 #include <cmath>
 6
 7 using namespace std;
 8 #define lson o<<1
 9 #define rson o<<1|1
10 #define max(a,b) (a)>(b)?(a):(b)
11 #define min(a,b) (a)<(b)?(a):(b)
12 #define INF 200000000
13 #define SKIP(p) while(*p==' ')++p;
14
15 typedef long long ll;
16 char s[300],q[300];
17 int res;
18 void solve(char *s,char *q){
19     char *p;
20     int sgn=1;
21     for(p=s;p<=q;p++){
22        if(*p=='+')sgn=1;
23        else if(*p=='-')sgn=-1;
24        else if(*p=='('){
25          char *t;
26          int cnt=1;
27          for(t=p+1;t<=q;t++){
28             if(*t=='(')cnt++;
29             else if(*t==')')cnt--;
30             if(!cnt)break;
31          }
32          if(sgn>0)*p=*t=' ';
33          if(t-p>2)solve(p+1,t-1);
34        }
35     }
36 }
37 void deal(char *p,int n){
38    for(int i=0;i<n;i++)if(p[i]<='Z'&&p[i]>='A'){
39       int l=i-1,r=i+1;
40       while(l>=0&&r<n){
41          if(p[l]!='('||p[r]!=')')break;
42          p[l]=p[r]=' ';
43          l--;r++;
44       }
45    }
46    solve(p,p+n-1);
47 }
48 int main(){
49    //freopen("r.in","r",stdin);freopen("r.out","w",stdout);
50    int t;
51    scanf("%d",&t);
52    gets(s);
53    while(t--){
54       gets(s);
55       char *p=s;
56       res=0;
57       for(;*p!='\0';p++){
58          SKIP(p);
59          q[res++]=*p;
60       }
61       deal(q,res);
62       for(int i=0;i<res;i++)if(q[i]!=' ')
63           printf("%c",q[i]);
64       printf("\n");
65    }
66    return 0;
67 }

View Code


转载于:https://www.cnblogs.com/Ixia/p/3913848.html

狗狗40题~ (Volume C)相关推荐

  1. 【剑指Offer】俯视50题之31 - 40题

    [剑指Offer]俯视50题之31 - 40题 面试题31连续子数组的最大和 面试题32从1到n整数中1出现的次数 面试题33把数组排成最小的数 面试题34丑数 面试题35第一个仅仅出现一次的字符 面 ...

  2. [剑指offer][JAVA][面试第40题][最小的k个数][快选][堆][BST]

    [问题描述]面试第40题 最小的k个数 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 : 输入:arr ...

  3. JAVA经典算法40题

    JAVA经典算法40题 [程序1]  题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析 ...

  4. 科研伦理与学术规范 期末考试2(40题)

    科研伦理与学术规范 期末考试1(40题) 2020.12.30 题目顺序可能不对,答案没问题. 免费下载~~~ 侵删 可以下载PDF 进行搜索查询 1.在科学研究的伦理原则中,科技工作者应该坚持科学研 ...

  5. java求公式例题_JAVA经典算法40题

    1: JAVA经典算法40题 2: [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 3 ...

  6. java 算法_JAVA经典算法40题

    [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1 ...

  7. 干货 | 数据挖掘过关40题

    今天为大家准备了40道数据挖掘的题,试试你的能力吧! 答案请见文末 1.某超市研究销售纪录数据后发现,买啤酒的人很大概率也会购买尿布,这种属于数据挖掘的哪类问题? A.关联规则发现 B.聚类 C.分类 ...

  8. LeetCode Week 4:第 31 ~ 40 题

    专栏--LeetCode 文章目录 专栏--LeetCode 31. 下一个排列 2. 最长有效括号 34. 在排序数组中查找元素的第一个和最后一个位置 35. 搜索插入位置 36. 有效的数独 37 ...

  9. JAVA经典算法40题(供面试所用)

    [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1 ...

最新文章

  1. 青岛能源所提出微生物组相似度新算法DMS
  2. Qt 获取文件夹下所有文件
  3. 2014.03.20入职第四天
  4. 2440按键中断编程
  5. windowbuilder怎么加背景图_小红书引流:爆款笔记封面图怎么做?(内附教程)...
  6. 这么说吧,NIO很简单,其实就是个牛逼IO
  7. 进来看下你的工资水平
  8. Python爬虫之爬取酷狗音乐
  9. 用Java写脚本,常用的一些方法
  10. java knn kd树_KNN算法之KD树
  11. 如何组织可持续的团队内部分享
  12. XSS是什么?(Xmind配文详解)
  13. Latex 编译报错: Misplaced omit.
  14. 【转】台湾教授-如何阅读科研论文
  15. 去重的几种方法(部分)
  16. 2022-2027年中国在线语言教育行业市场深度分析及投资战略规划报告
  17. 微赞html写入,微赞WZ-后台一键更新-授权
  18. 淘宝无货源与亚马逊无货源模式谁更好做?
  19. 红旗Linux4.1下安装Apahce+Tomcat+PHP+mySQL+vsFTPd实录
  20. 让你的网站(MAXCMS4_0)按地区、年份、语言生成分页面(已经修正) -

热门文章

  1. 网络唤醒 php,php 远程唤醒电脑 php源码远程唤醒电脑 远程开机
  2. post请求https安全证书问题2.0
  3. 感恩人生的每一段经历
  4. 在线存储 离线存储 近线存储
  5. 计算机功能清单,如何使用印象笔记的清单功能?清单快速上手教程
  6. 0926物体检测和数据集
  7. 关于VS2017许可证过期问题
  8. 【记录】螺纹连接与螺旋传动
  9. 【写博客常用】参考文献一定要按顺序标么
  10. Codeforces Global Round 21) C. Fishingprince Plays With Array