CROC-MBTU 2012, Elimination Round (ACM-ICPC)

来源:互联网 发布:win7无法打开网络共享 编辑:程序博客网 时间:2024/05/22 03:30

代码很烂,将就着看吧~

点击打开题目链接

A. System Administrator


 水题

代码: 

#include<iostream>#include<cstring>#include<math.h>#include<cstdio>#include<cstdlib>using namespace std;int main(){ double a,b,c; int n,i,j,k; double sum1,sum2,s1,s2;while(~scanf("%d",&n)) {    sum1=sum2=s1=s2=0;  for(i=0;i<n;i++)  {      cin>>a>>b>>c;    if(a==1)     { sum1+=b+c;s1+=b;}    else    {        sum2+=b+c;s2+=b;    }     }    if(s1/sum1>=0.5)    puts("LIVE");  else    puts("DEAD");  if(s2/sum2>=0.5)    puts("LIVE");  else    puts("DEAD"); }    return 0;}

B. Internet Address


水题,就是给你个字符串,写成<protocol>://<domain>.ru[/<context>]的形式

代码:

 

#include<iostream>#include<cstring>#include<math.h>#include<cstdio>#include<cstdlib>using namespace std;int main(){ char a[100]; int i,j,k; while(~scanf("%s",a)) {     int t=strlen(a),s;     if(a[0]=='h')       {           s=4;         for(i=0;i<4;i++)           printf("%c",a[i]);          }      else      {         s=3;         for(i=0;i<3;i++)           printf("%c",a[i]);      }     printf("://%c",a[s++]);    for(int i=s;i<t-1;i++)    {        if(a[i]=='r'&&a[i+1]=='u'&&i+1<t-1)        {            printf(".%c%c/",a[i],a[i+1]);k=i+1;               break;        }        else         if(a[i]=='r'&&a[i+1]=='u')        {            printf(".%c%c\n",a[i],a[i+1]); k=i+1;               break;        }        else         printf("%c",a[i]);    }     for(j=k+1;j<t;j++)         printf("%c",a[j]);     cout<<endl; }    return 0;}
C. Game with Coins

题意:给你一个序列,每次任选一个x,使得x,2*x,2*x+1的位置上的数减一,求至少经过多少次,所有的书都变成0.

第一反应就是贪心,结果过了

代码:

#include<iostream>#include<cstring>#include<math.h>#include<cstdio>#include<cstdlib>using namespace std;int main(){ int n,i,j,k,s,Max; int a[105]; while(~scanf("%d",&n)) {    int sum=0;    Max=0;s=0;     memset(a,0,sizeof(a));     for(i=1;i<=n;i++)      {        scanf("%d",&a[i]);      }     if(n==1||n==2||n%2==0)      {       printf("-1\n");        continue;        }    for(i=n/2;i>0;i--)    {        Max=max(a[2*i],a[2*i+1]);        a[2*i]=0,a[2*i+1]=0,a[i]=max(0,a[i]-Max);        sum+=Max;    }   for(i=0;i<n;i++)    sum+=a[i];    printf("%d\n",sum); }    return 0;}

D.Restoring Table

题意:给你一个矩阵使得bij = ai & aj,求数列a


这道题的要求是只要给出其中一个结果就可以,所以,与的反运算就是或运算



代码:

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<stack>#include<algorithm>using namespace std;long long a[1005],c[1005][1005]; int main() {     int n,i,j,k;    while(cin>>n)    {      for(i=0;i<n;i++)        for(j=0;j<n;j++)           cin>>c[i][j];     for(i=0;i<n;i++)     {       for(j=0;j<n;j++)        if(c[i][j]!=-1)          a[i]=a[i]|c[i][j];     }    printf("%d ",a[0]);    for(int i=1;i<n;i++)      printf(" %d",a[i]);    cout<<endl;     }     return 0; }

E. Mishap in Club

题意:给你一个字符串,只由+和-组成,每进一个人,用+表示,出一个人用减表示,求最少多少人能完成这些操作

用堆栈,每次栈顶与要进栈的字符不一样时,出栈;分别记录过程中栈中"+"和"-"的最大值,然后相加。

代码:

 

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<stack>#include<algorithm>using namespace std;stack<char>s1; char a[350]; int Max1,Max2; int main() {     int i,j,k,ss;   while(~scanf("%s",a))   {     int t=strlen(a);     Max1=0,Max2=0;     ss=0;     s1.push(a[0]);     if(a[0]=='-') Max2=1;     if(a[0]=='+') Max1=1;    for(i=1;i<t;i++)    {       if(!s1.empty()&&(s1.top()!=a[i]))        {           s1.pop();          }       else        {           s1.push(a[i]);           }     if(!s1.empty()&&Max1<s1.size()&&s1.top()=='+')        Max1=s1.size();     else        if(!s1.empty()&&Max2<s1.size()&&s1.top()=='-')           Max2=s1.size();      //cout<<Max1<<"***"<<Max2<<endl;    }      printf("%d\n",Max1+Max2);      while(!s1.empty())         s1.pop();      }     return 0; }

后来发现实验室的都是这么做的(感觉他们做的简单,写代码能力太差):

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<stack>#include<algorithm>using namespace std;char a[350]; int main() {     int i,j,k,sum1,sum2,s,e;   while(~scanf("%s",a))   {     int t=strlen(a);      s=0;e=0;    int ss=0;    sum1=sum2=0;    for(i=0;i<t;i++)      {        if(a[i]=='+')          ss++;        else          ss--;        s=min(s,ss);        e=max(e,ss);      }     printf("%d\n",max(1,e-s));   }     return 0; }


0 0
原创粉丝点击