odeforces Round #145 (Div. 2)

http://codeforces.com/contest/234

做出来三题。第一题感觉不难,但是一直想不到好的做法。就先做了B,C。B很简单。C想到了也很简单。。

记录下做法:

A:感觉我的应该算作贪心。。。不知道是不是想复杂了。我是这么想的,要不是L多余R,要不是R多余L。于是可以先把左右位置确定下来,再判断是否满足左右相差大于1。

假如不大于1的话。比如 3 4.那么右边除了2以外。其他的都可以代替4。。。

View Code
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cmath>
 6 #include <queue>
 7 #include <stack>
 8 using namespace std;
 9 
10 #define MAXN 110
11 int n;
12 char s[110];
13 
14 
15 int main()
16 {
17     //freopen("input.txt","r",stdin);
18     //freopen("output.txt","w",stdout);
19     while(cin>>n)
20     {
21         cin>>s;
22         int left[MAXN];
23         int right[MAXN];
24         int le,re;
25         queue<int>L;
26         while(!L.empty())
27             L.pop();
28         queue<int>R;
29         while(!R.empty())
30             R.pop();
31         for(int i=0;i<n;i++)
32             if(s[i]=='L')
33                 L.push(i+1);
34             else
35                 R.push(i+1);
36         le=0;
37         re=0;
38         while(le<n/2)
39         {
40             if(L.empty())
41                 break;
42             left[le++]=L.front();
43             L.pop();
44         }
45         while(!L.empty())
46         {
47             right[re++]=L.front();
48             L.pop();
49         }
50         while(le<n/2)
51         {
52             if(R.empty())
53                 break;
54             left[le++]=R.front();
55             R.pop();
56         }
57         while(!R.empty())
58         {
59             right[re++]=R.front();
60             R.pop();
61         }
62         sort(left,left+(n/2));
63         sort(right,right+(n/2));
64         for(int i=0;i<(n/2);i++)
65         {
66             if(abs(left[i]-right[i])<=1)
67             {
68                 if(abs(left[i]-right[(i+1)%(n/2)])<=1)
69                 {
70                     int t=right[i];
71                     right[i]=right[(i+2)%(n/2)];
72                     right[(i+2)%(n/2)]=t;
73                 }
74                 else
75                 {
76                     int t=right[i];
77                     right[i]=right[(i+1)%(n/2)];
78                     right[(i+1)%(n/2)]=t;
79                 }
80             }
81         }
82         for(int i=0;i<(n/2);i++)
83             cout<<left[i]<<" "<<right[i]<<endl;
84     
85     }
86     return 0;
87 }

B:排序

View Code
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cmath>
 6 #include <queue>
 7 #include <stack>
 8 using namespace std;
 9 
10 struct node
11 {
12     int id;
13     int light;
14 };
15 node lie[1010];
16 int  n,k;
17 bool cmp(const node & a,const node &b)
18 {
19     return a.light>b.light;
20 }
21 
22 int main()
23 {
24     freopen("input.txt","r",stdin);
25     freopen("output.txt","w",stdout);
26     while(~scanf("%d%d",&n,&k))
27     {
28         for(int i=1;i<=n;i++)
29         {    
30             scanf("%d",&lie[i].light);
31             lie[i].id=i;
32         }
33         sort(lie+1,lie+n+1,cmp);
34         printf("%d\n",lie[k].light);
35         printf("%d",lie[1].id);
36         for(int i=2;i<=k;i++)
37             printf(" %d",lie[i].id);
38         printf("\n");
39     }
40     return 0;
41 }

C:

int sum[MAXN];表示从2->i的这些数中>=0的有多少
int sum2[MAXN];表示从n-1->i的这些数中<=0的有多少。

View Code
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cmath>
 6 #include <queue>
 7 #include <stack>
 8 using namespace std;
 9 
10 #define MAXN 100010
11 int  n,ans;
12 int num[MAXN];
13 int sum[MAXN];
14 int sum2[MAXN];
15 int main()
16 {
17     //freopen("input.txt","r",stdin);
18 //    freopen("output.txt","w",stdout);
19     while(scanf("%d",&n) != EOF)
20     {
21         ans=MAXN;
22         int cnt=0;
23         memset(sum,0,sizeof(sum));
24         memset(sum2,0,sizeof(sum2));
25         scanf("%d",&num[1]);
26         for(int i=2;i<n;i++)
27         {
28             scanf("%d",&num[i]);
29             sum[i]=sum[i-1];
30             if(num[i]>=0)
31                 sum[i]++;
32         }
33         scanf("%d",&num[n]);
34         for(int i=n-1;i>=2;i--)
35         {
36             sum2[i]=sum2[i+1];
37             if(num[i]<=0)
38                 sum2[i]++;
39         }
40         ans=MAXN*100;
41         for(int i=1;i<=n-1;i++)
42         {
43             if(sum[i]+sum2[i+1]<ans)
44                 ans=sum[i]+sum2[i+1];
45         }
46         if(num[1]>=0)
47             ans++;
48         if(num[n]<=0)
49             ans++;
50         printf("%d\n",ans);
51     }
52     return 0;
53 }

 

posted @ 2012-10-16 19:04  Missa  阅读(282)  评论(2编辑  收藏  举报