题
第八周
老和尚与小和尚
problem description
从前有个老和尚对小和尚讲故事,他说他早上看到一个年轻男子赶着n头牛,在农田里耕种,突然下起了大雨,年轻男子怕牛着凉了,就打算把它们安排到几个各自分开的草棚下面避雨,他一共有q次操作,每次操作都将牛Xi与牛Yi所在的草棚合并在一起,对于n头牛,编号分别为1,2,3,...,n。
多组输入。对于每组测试数据,第一行包含两个整数n,m,表示n头牛,m次操作,接下来m行,每行包括三个整数Zi,Xi,Yi,当Zi=1时,将牛Xi与牛Yi所在的草棚合并在一起,当Zi=2时,请输出牛Xi和牛Yi是否在一个草棚,是的输出"Yes",否则输出"No"(不包含双引号)。(1<=n<=10000,1<=m<=200000)
对于Zi=2时,输出"Yes"或"No"(不包含双引号)。行末换行。
sample input
4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4
sample output
No
Yes
No
Yes
标程
#include <bits/stdc++.h>
using namespace std;
bool check(string a,string b){
if(a.size()!=b.size())
return a.size()>b.size();
int p=0;
while(p<(a.size())&&a[p]==b[p])
p++;
if(p==a.size()||a[p]>b[p])//a>=b为true
return true;
else
return false;
}
int ans[20010],len;
string a,b;
void work(){
int jw=0,i,j;
for(i=a.size()-1,j=b.size()-1;i>=0&&j>=0;i--,j--){
if(a[i]-b[j]+jw<0)
ans[len++]=10+jw+(a[i]-b[j]),jw=-1;
else
ans[len++]=a[i]-b[j]+jw,jw=0;
}
for(;i>=0;i--)
if(a[i]-'0'+jw<0)
ans[len++]=10+jw+a[i]-'0',jw=-1;
else
ans[len++]=jw+a[i]-'0',jw=0;
}
int main(){
while(cin>>a>>b){
int flag=0;
if(!check(a,b))
swap(a,b),flag=1;
memset(ans,0,sizeof(ans));
len=0;
work();
if(flag)
cout<<"-";
int flag2=0;
for(int i=len-1;i>=0;i--){
if(ans[i]!=0)
flag2=1;
if(flag2)
cout<<ans[i];
}
if(!flag2)
cout<<0;
cout<<"\n";
}
}高飞学长的多边形
problem description
高飞学长最喜欢的几何图形是规则的多面体。 请注意,有五种规格的多面体:
四面体。 四面体有4个三角形面。
立方体。 多维数据集具有6个正方形的面。
八面体。 八面体有8个三角形面。
十二面体。 十二面体有12个五边形的面。
二十面体。 二十面体有20个三角形面。
高飞学长有n个多面体。 一天,他想知道他的多面体总共有多少个面。 帮助高飞学长,找到答案!
多组输入,输入的第一行包含一个整数n(1≤n≤200000)表示青竹学长拥有的多面体的数量。
接下来n行中的每一行都包含字符串Si表示青竹学长多面体中第i个多面体的名称。 该字符串可以如下所示:
如果青竹学长手中的第i个多面体是四面体,则为“Tetrahedron”(不带引号)。
如果青竹学长手中的第i个多面体为立方体,则为“Cube”(不带引号)。
如果青竹学长手中的第i个多面体是八面体,则为“Octahedron”(不带引号)。
如果青竹学长手中的第i个多面体是十二面体,则为“Dodecahedron”(不带引号)。
如果青竹学长手中的第i个多面体是二十面体,则为“Icosahedron”(不带引号)。
行末换行,输出一个数字表示青竹学长拥有的所有多面体的总面数。
sample input
4
Icosahedron
Dodecahedron
Tetrahedron
Cube
3
Dodecahedron
Octahedron
Octahedron
sample output
42
28
标程
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
while(cin>>n){
int ans=0;
for(int i=0;i<n;i++){
string s;
cin>>s;
if(s=="Tetrahedron")
ans+=4;
if(s=="Cube")
ans+=6;
if(s=="Octahedron")
ans+=8;
if(s=="Dodecahedron")
ans+=12;
if(s=="Icosahedron")
ans+=20;
}
cout<<ans<<endl;
}
return 0;
}公式求和
problem description
已知:Sn= 2+2/2+2/3+2/4+…+2/n。
现给出一个整数k,要求计算出一个最小的n,使得 Sn>k,保证总能满足该条件。(Sn结果应为浮点型)
多组输入,每行一个正整数k(1<=k<=30)
一个正整数n,行末换行。
sample input
1
sample output
1
标程
#include <bits/stdc++.h>
using namespace std;
int main(){
int k,n;
while(cin>>k){
double ans=0;
n=0;
for(;ans<=k;++n,ans+=2.0/n);
cout<<n<<endl;
}
return 0;
}Bernard的遗传密码
problem description
Bernard正在设计一种新型细菌的遗传密码,以有效地生产疫苗。具体来说,Bernard专注于编码一种蛋白质的DN***段。 DN***段由仅包含字符“ A”,“ T”,“ G”和“ C”的字符串表示。
Bernard已确定,如果DN***段中某一段的最大连续相同核苷酸的序列长度为偶数,则该蛋白质将无功能。例如,由DNA字符串“ GTTAAAG”描述的蛋白质。它包含四个最大的连续相同核苷酸序列:“ G”,“ TT”,“ AAA”和“ G”。该蛋白质是无功能的,因为序列“ TT”具有偶数长度。
Bernard正在尝试从他目前拥有的蛋白质中获得功能性蛋白质。 Bernard可以在DN***段中插入其他核苷酸。每个其他核苷酸都是{'A','T','G','C'}中的一个字符。 Bernard希望确定使DNA编码功能蛋白所需的最小插入次数。
多组输入,其中包含长度为n(1≤n≤100)的字符串s。 s的每个字符都来自集合{'A','T','G','C'}。
输出一个整数表示使DNA能够编码功能蛋白所需的最小插入次数。行末换行
sample input
GTTAAAG
AACCAACCAAAAC
sample output
1
5
标程
#include <bits/stdc++.h>
using namespace std;
int main () {
string s;
while(cin>>s){
int n, sum, res;
n=sum=res=0;
for(int i = 0; i < s.size(); i++){
sum++;
if(s[i] != s[i+1]){
if(sum % 2 == 0){
res++;
}
sum = 0;
}
}
cout<<res<<endl;
}
return 0;
}⑨的网格
problem description
sample input
1 1
2 3
sample output
0
14
标程
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
typedef long long ll;
int main() {
ll i,j,m,n,t,sum;
while(cin>>m>>n) {
sum=0;
for(i=2; i<=n; i+=2)
for(j=2; j<=m; j+=2)
sum+=(n-i+1)*(m-j+1);
sum *= 2;
for(ll y = 2; y <= m; y += 2) {
sum += (n + 1) * (m - y + 1);
}
for(ll y = 2; y <= n; y += 2) {
sum += (m + 1) * (n - y + 1);
}
cout<<sum<<endl;
}
return 0;
}
