NOIP2010

1.引水入城

DP,区间覆盖

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 inline int read()
 4 {
 5     int x=0;char c=getchar();
 6     for(;!isdigit(c);c=getchar());
 7     for(;isdigit(c);c=getchar()) x=x*10+c-'0';
 8     return x;
 9 }
10 const int N=505;
11 int n,m;
12 int l[N][N],r[N][N],h[N][N];
13 bool vis[N][N];
14 int xx[4]={1,0,-1,0},yy[4]={0,1,0,-1};
15 
16 
17 inline void dfs(int x,int y)
18 {
19     vis[x][y]=true;
20     for(int i=0;i<4;i++)
21     {
22         int nx=x+xx[i];
23         int ny=y+yy[i];
24         if(h[nx][ny]>=h[x][y]) continue;
25         if(!vis[nx][ny]) dfs(nx,ny);
26         l[x][y]=min(l[x][y],l[nx][ny]);
27         r[x][y]=max(r[x][y],r[nx][ny]);
28     }
29 }
30 int main()
31 {
32     memset(l,0x3f,sizeof(l));
33     n=read();m=read();
34     for(int i=1;i<=n;i++)
35         for(int j=1;j<=m;j++)
36             h[i][j]=read();
37     for(int i=1;i<=m;i++)
38     {
39         l[n][i]=r[n][i]=i;
40     }
41     for(int i=1;i<=m;i++) dfs(1,i);
42     int cnt=0;
43     for(int i=1;i<=m;i++)
44         if(!vis[n][i]) cnt++;
45     if(cnt)
46     {
47         printf("0\n%d\n",cnt);
48         return 0;
49     }
50     int left=1;
51     int ans=0;
52     while(left<=m)
53     {
54         int maxr=0;
55         for(int i=1;i<=m;i++)
56             if(l[1][i]<=left) maxr=max(maxr,r[1][i]);
57         ans++;
58         left=maxr+1;    
59     }
60     printf("1\n%d\n",ans);
61     return 0;
62 } 
View Code

 2.机器翻译

模拟

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 inline int read()
 4 {
 5     int x=0;char c=getchar();
 6     for(;!isdigit(c);c=getchar());
 7     for(;isdigit(c);c=getchar()) x=x*10+c-'0';
 8     return x;
 9 }
10 int n,m;
11 bool vis[1005];
12 int a[1005];
13 int main()
14 {
15     n=read();m=read();
16     int tail=0;
17     int ans=0;
18     for(int i=0;i<m;i++)
19     {
20         int x=read();x++;
21         if(vis[x]) continue;
22         vis[a[tail]]=false;
23         a[tail]=x;
24         tail=(tail+1)%n;
25         vis[x]=true;
26         ans++;
27     }
28     printf("%d\n",ans);
29     return 0;
30 }
View Code

 

posted @ 2020-08-18 08:00  SuYongkang  阅读(77)  评论(0)    收藏  举报