A. Majestic 10
解题思路:每次输入三个整数,三个数都小于零输出“zilch”,一个大于零输出“double”,两个大于零输出“double-double”,三个都大于零输出“triple-double”
#include<iostream>
#include<cmath>
using namespace std;
int a[1000],b[1000],c[1000],counts[10000];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i]>>c[i];
if(a[i]>=10)
counts[i]++;
if(b[i]>=10)
counts[i]++;
if(c[i]>=10)
counts[i]++;
}
for(int i=1;i<=n;i++){
cout<<a[i]<<" "<<b[i]<<" "<<c[i]<<endl;
if(counts[i]==0){
cout<<"zilch"<<endl;
}else if(counts[i]==1){
cout<<"double"<<endl;
}else if(counts[i]==2){
cout<<"double-double"<<endl;
}else{
cout<<"triple-double"<<endl;
}
if(i<n){
cout<<endl;
}
}
return 0;
}
B. Phoneme Palindromes
解题思路:给定发音相同的字母和一个字符串,将发音相同的两个字母的任意一个换成另外一个,再判断是否为回文,对于每个测试用例,输出标题“Test case #n:”,其中n表示用例号从1开始。然后打印该测试用例的每个字符串,后面跟一个空格,后面跟一条消息(YES或NO),指示该字符串是否是音素回文。在每个测试用例的输出之后留下空行。
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include <string.h>
using namespace std;
int main()
{
int n,t,i,n2;
char arr[13][2];
cin>>t;
for(int k=1;k<=t;k++)
{
cout<<"Test case #"<<k<<':'<<endl;
cin>>n;
for(i=0; i<n; i++)
{
cin>>arr[i][0]>>arr[i][1];
}
cin>>n2;
while(n2--){
string a,b;
cin>>a;
b=a;
int len =a.length();
for(i=0;i<len;i++){
for(int j=0;j<n;j++){
if(a.at(i)==arr[j][1]){
a.at(i)=arr[j][0];
}
}
}
for(i=0;i<len;i++){
if(a.at(i)!=a.at(len-i-1)){
break;
}
}
if(i==len){
cout<<b<<' '<<"YES"<<endl;
}else{
cout<<b<<' '<<"NO"<<endl;
}
}
cout<<endl;
}
return 0;
}
C. Don't Break the Ice
解题思路:给定一个正方形棋盘的尺寸(行数和列数)和一个移动列表,确定尝试移动的次数,这些移动将击倒一个不在棋盘上的冰块。当一块冰砖被敲碎时,其他的冰砖可能也会从木板上掉下来。更具体地说,一个冰块会掉下来,除非它在一个完整的行(行包含它所有的冰块)或它在一个完整的列(列包含它所有的冰块)。判断每一步移动的冰块,所在的行和列是否完整
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include <string.h>
using namespace std;
int main()
{
int n,s,i,count,t,a,b;
cin>>t;
for(int k=1;k<=t;k++)
{
int c[51][51]={0};
count=0;
cin>>n>>s;
while(s--){
cin>>a>>b;
int flag1=0,flag2=0;
for(i=0;i<n;i++){
if(c[a-1][i]==1){
flag1=1;
}
if(c[i][b-1]==1){
flag2=1;
}
}
if(flag1==1&&flag2==1){
count++;
}
c[a-1][b-1]=1;
}
cout<<"Strategy #"<<k<<": ";
cout<<count<<endl;
if(k!=t)
cout<<endl;
}
return 0;
}
D. Wildest Dreams
当Anya上车时,她的歌从头开始播放,只要Anya在车里,这首歌就会一直重复播放。你可以假设,如果Anya在她的歌播放到一半时从车里出来,Arup会继续听她的歌,而不是把CD转发到下一首歌,但当Anya的歌播放完后,下一首歌会继续播放。如果Anya的歌正好在她下车的时候结束,那么下一首歌就会继续。Anya的歌并没有回到开头。
每张CD的第一行输入将包含两个整数:t(1≤t≤20),CD上的曲目数量,k(1≤k≤t), Anya痴迷的曲目。每张CD的第二行输入包含正整数分隔的t空格,表示CD上每个t音轨的长度,下面的d行包含每天的信息。每一行都以一个整数si始。(1≤s≤20),表示第i天的行驶段数,后面是s正整数,表示每个行驶段的长度,单位为秒。假设Anya在车中进行奇数段(第一、第三、第五等)。
计算Arup听Anya喜欢的歌的时间,奇数段时间直接求和,并确定奇数段结束的时候播放的位置。正好播完则直接进入循环,没播完sum+剩余的时间,开始循环播放,循环的时间-剩余时间,算一共循环了几周,乘以歌的时间,加上,如果结束时正在播放Anya喜欢是歌曲,加上已播放的时间
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include <string.h>
using namespace std;
int main()
{
int cd,i;
cin>>cd;
for(int k=1;k<=cd;k++)
{ int sum2=0;
cout<<"CD #"<<k<<":"<<endl;
int cds,f;
int a[25];
cin>>cds>>f;
for(i=0;i<cds;i++){
cin>>a[i];
sum2+=a[i];
}
int n;
cin>>n;
while(n--){
int m;
int sum=0;
cin>>m;
int b[25];
for(i=0;i<m;i++){
cin>>b[i];
}
for(i=0;i<m;i++){
if(i%2==0){
sum+=b[i];
}
if(i%2==1){
int sheng=b[i-1]%a[f-1];
if(sheng!=0){
b[i]-=a[f-1]-sheng;
if(b[i]>0){
sum+=a[f-1]-sheng;
}else{
sum+=b[i]+a[f-1]-sheng;
b[i]=0;
}
}
sheng=b[i]/sum2;
sum+=sheng*a[f-1];
sheng=b[i]%sum2;
if(sheng-sum2+a[f-1]>0){
sum+=sheng-sum2+a[f-1];
}
}
}
cout<<sum<<endl;
}
cout<<endl;
}
return 0;
}
H. Count the Dividing Pairs
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxn1 1000010
#define maxn2 10000010
typedef long long ll;
int a[maxn1],b[maxn2];
ll f(int a,int b);
int main(){
int n,i,j;
int p,maxx=0;
long long counts=0;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&p);
maxx=0,counts=0;
memset(b,0,sizeof(b));
for(j=0;j<p;j++){
scanf("%d",&a[j]);//所以换成cin就超时了?
b[a[j]]++;
maxx=max(maxx,a[j]);
}
counts=f(b[0],p-b[0]);
counts+=f(b[1],p-b[0]-b[1]);
for(j=2;j<=maxx/2;j++){
if(b[j]){
for(int k=2*j;k<=maxx;k+=j){
if(b[k])
counts+=f(b[j],b[k]);
}
}
}
printf("Test case #%d: ",i);
printf("%lld
",counts);
}
return 0;
}
ll f(int a,int b){
long long end=a;
end*=b;
return end;
}