zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    ios NSString format 保留小数点 float double
    IOS中延时执行的几种方式的比较和汇总
    ioss使用xcode常用快捷键
    iphone 6plus 下app里的状态栏和界面会被放大的问题//以及设置APP闪屏页/APP图标流程
    iostbleView刷新后显示指定cell
    iOS-打包成ipa的4种方法
    iosttableViewCell右侧的箭头,圆形等
    Linux学习之CentOS(二十)------vi/vim 按键说明
    gzip
    bzip2
  • 原文地址:https://www.cnblogs.com/Missa/p/2726532.html
Copyright © 2011-2022 走看看