代码很烂,将就着看吧~
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;
}