A. Another Server
何老师某天在机房里搞事情的时候,发现机房里有n台服务器,从1到n标号,同时有2n-2条网线,从1到2n-2标号,其中第i条网线双向连接着\lfloor \frac{i+1}{2} \rfloor号服务器和\lfloor \frac{i+1}{2} \rfloor+1号服务器,在一个单位时间内最多能够承受x_i个单位流量。
显然这些服务器之间要进行信息交换,为了测试服务器的抗压能力,你需要帮何老师计算出1号服务器在一个单位时间内最多能向n号服务器发送多少个单位流量的数据,这里认为数据的传输是瞬间完成的。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int x[2222];
int main(){
int T,n;
cin>>T;
while(T--){
cin>>n;
for(int i=1;i<=n+n-2;i++)
cin>>x[i];
int ans = x[1] + x[2];
for(int i=2;i<=n-1;i++)
ans = min(ans,x[i+i-1] + x[i+i]);
cout<<ans<<endl;
}
return 0;
}
C. Captcha Cracker
www.02469.com(本网页纯属虚构,如有雷同,纯属巧合),是一个资源丰富的教学资源网站,好学的SK同学经常访问这个网站。通常来说,网站为了安全考虑,登录的时候都需要用户输入验证码,这就让SK同学非常不爽了。
SK同学希望你能帮他写一个程序来自动识别验证码的内容,验证码由小写字母和阿拉伯数字组成,你需要识别出其中所有的0,2,4,6,9以及这5个数字对应的英文单词,并按照它们在验证码中出现的顺序以数字形式输出。
为了表示感谢,SK同学愿意跟你分享他私藏的教学资源(详情请参考气球上的logo)。
模拟题。。。。把zero 输出成 1 ,wa了一发。。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
using namespace std;
string st;
int main(){
int T;
cin>>T;
while(T--){
cin>>st;
int i=0;
while(i<st.size()){
if(st[i]=='0' || st[i]=='2' || st[i]=='4' || st[i]=='6' || st[i]=='9'){
putchar(st[i]);
i++;
continue;
}
if(st.substr(i,4) == "zero"){
putchar('0');
i+=4;
continue;
}
if(st.substr(i,3) == "two"){
putchar('2');
i+=3;
continue;
}
if(st.substr(i,4) == "four"){
putchar('4');
i+=4;
continue;
}
if(st.substr(i,3) == "six"){
putchar('6');
i+=3;
continue;
}
if(st.substr(i,4) == "nine"){
putchar('9');
i+=4;
continue;
}
i++;
}
puts("");
}
return 0;
}
D. Disdain Chain
n-1个人链子,第n个人必然能连进去,于是n个人的图就一定是n个人的链子。
前n-1个链子就0个。
n个人链子的个数为
#include <cstdio>
int main(){
int T,n;
int i;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(i=0;i<n-1;i++) puts("0");
printf("%d\n",1<<(n*(n-1)/2));
}
return 0;
}
E. Euclidean Geometry
在某节无聊的课上,SK同学随意画了一个三角形然后用尺子量了一下,发现三边长分别为a,b,c,然后SK同学拿起圆规分别以三个顶点为圆心画了三个圆,为了使图形看上去更美观,这三个圆两两不相交也互不包含,这里认为圆的半径可以是0(称之为“点圆”),现在SK同学想知道怎么画圆才能使三个圆的面积之和最大。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const long double pi = 3.1415926535897932384626434;
const double eps = 1e-7;
long double a[3];
int main(){
int T;
cin>>T;
while(T--){
cin>>a[0]>>a[1]>>a[2];
a[0]*=10000.0;a[1]*=10000.0;a[2]*=10000.0;
sort(a,a+3);
long double ans = a[1]*a[1] + (a[2] - a[1])*(a[2] - a[1]);
ans = ans * pi;
printf("%.12Lf\n",ans / 100000000);
}
return 0;
}
K. Keep In Line
又到饭点了,SK同学靠着惯性走到了食堂,但长长的队伍顿时让他失去了食欲。突然,他注意到某个窗口前的队伍里明显存在插队的现象,于是他默默记录下了同学们进队和出队的变化。
对于进队,SK同学只知道队伍里多了一个人,并不知道新来的人是老老实实站到了队尾还是插到了队伍里的某个位置;对于出队,SK同学能确定是队伍里站在最前面的人出队了。
初始时队伍为空,给出n条队伍进出的信息,保证已经出队的同学不会再入队,并且最终队伍也为空,现在SK同学想知道有多少不插队的好同学。
如果是in则直接进队。
如果是out,如果当前队首就是这个人,直接出队。否则就算插队。
用map标记,协助判断。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <map>
using namespace std;
int n;
queue<string> Q;
map<string,int> mp;
int main(){
int T;
cin>>T;
while(T--){
cin>>n;
int ans = 0;
string tp,st;
mp.clear();
while(!Q.empty()) Q.pop();
for(int i=1;i<=n;i++){
cin>>tp>>st;
if(tp == "in"){
Q.push(st);
} else {
while(mp[Q.front()] == 1){
Q.pop();
}
if(st == Q.front())
ans++;
mp[st] = 1;
}
}
cout<<ans<<endl;
}
return 0;
}