A
选自2016ACM/ICPC亚洲区域赛-沈阳站
#include<stdio.h>
int max(int x,int y)
{
if(x>y)
return x;
return y;
}
int min(int x,int y)
{
if(x<y)
return x;
return y;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",max(a,b)*2+min(a,b));
}
return 0;
}
B
同A题 选自2016ACM/ICPC亚洲区域赛-沈阳站
#include<stdio.h>
#include<string.h>
#define maxn 15
int num(char c)
{
if(c=='C')
return 12;
if(c=='O')
return 16;
return 1;
}
int main()
{
char str[maxn];
int T;
scanf("%d",&T);
while(T--)
{
memset(str,'\0',sizeof(str));
scanf("%s",str);
int sum=0;
int len=strlen(str);
for(int i=0; i<len; i++)
sum+=num(str[i]);
printf("%d\n",sum);
}
return 0;
}
C
#include<stdio.h>
#include<string.h>
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int a[26]= {0};
char str[1005];
scanf("%s",str);
int len=strlen(str);
for(int i=0; i<len; i++)
a[str[i]-'a']++;
int num=0;//记录次数
for(int i=0; i<26; i++)
{
if(a[i]>a[num])
{
num=i;
}
}
printf("%c %d\n",num+'a',a[num]);
getchar();//吸收换行
}
return 0;
}
D
#include<stdio.h>
#include<string.h>
#define maxn 10005
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
char s1[maxn];
scanf("%s",s1);
int len=strlen(s1);
int i;
int num=0;
for(i=0; i<len; i++)
{
if(s1[i]==s1[i+1])
{
num=1;
while(s1[i]==s1[i+1]&&i<len-1)
{
num++;
i++;
}
printf("%d%c",num,s1[i]);
}
else
printf("%c",s1[i]);
}
printf("\n");
}
return 0;
}
E
#include<stdio.h>
#include<string.h>
#define maxn 100005
int main()
{
char s1[maxn];//接收数据
char s2[maxn];//接收处理过的字符串
int len_s2=0;//s2的长度
int num=0;//每行字符数量
while(scanf("%s",s1)!=EOF)
{
if(strcmp(s1,"<br>")==0)//遇到就换一行
{
s2[len_s2++]='\n';
num=0;//清空一行的字符数量
continue;
}
else if(strcmp(s1,"<hr>")==0)//打印八十个字符
{
if(num!=0)
s2[len_s2++]='\n';
for(int i=0; i<80; i++)
s2[len_s2++]='-';
s2[len_s2++]='\n';
num=0;//清空一行的字符数量
continue;
}
int len_s1=strlen(s1);
if(num+1+len_s1>80)//换行的第一个单词
{
s2[len_s2++]='\n';
for(int i=0; i<len_s1; i++)
s2[len_s2++]=s1[i];
num=len_s1;
}
else//不换行的单词
{
if(num!=0)
s2[len_s2++]=' ';
for(int i=0; i<len_s1; i++)
s2[len_s2++]=s1[i];
num+=len_s1+1;
}
}
for(int i=0; i<len_s2; i++)
printf("%c",s2[i]);
printf("\n");
return 0;
}
F
#include<stdio.h>
#include<string.h>
char map_1[1005][105];//存储出现过的字符串
char map_2[1005][105];
int main()
{
int T;
scanf("%d",&T);
for(int casen=1; casen<=T; casen++)
{
int len;
scanf("%d",&len);//单个字符串长度
char str_1[105];
char str_2[105];
char str_12[205];
char str[205];//目标字符串
scanf("%s%s%s",str_1,str_2,str_12);
strcpy(str,str_12);//目标字符串存到str
int steap=0;//需要多少步才能完成
while(1)
{
strcpy(map_1[steap],str_1);
strcpy(map_2[steap],str_2);//存储出现过的字符串
for(int i=0,j=0; i<len; i++)
{
str_12[j++]=str_2[i];
str_12[j++]=str_1[i];//获取拼接出来的字符串
}
steap++;//拼接操作次数加一
if(strcmp(str,str_12)==0)
{
printf("%d ",casen);
printf("%d\n",steap);
break;//拼接出来的字符串和目标字符串相等
}
for(int i=0; i<len; i++)
str_1[i]=str_12[i];//获取新的字符串1
for(int i=len,j=0; i<len*2; i++,j++)
str_2[j]=str_12[i];//获取新的字符串2
bool is_break=0;//需要时就置为1
for(int i=0; i<steap; i++)//检测新的字符串1是否出现过
if(strcmp(map_1[i],str_1)==0)
{
printf("%d ",casen);
printf("-1\n");
is_break=1;
break;
}
if(is_break==1)
break;
for(int i=0; i<steap; i++)//检测新的字符串2是否出现过
if(strcmp(map_2[i],str_2)==0)
{
printf("%d ",casen);
printf("-1\n");
is_break=1;
break;
}
if(is_break==1)
break;
}
}
return 0;
}
G
听说这是一个斐波那契数列(然而我并没看出来)
我得到的规律:2→3,3→3+2;
就这样一直递归可以得到答案
#include<stdio.h>
#include<string.h>
//2-3,3-3+2
int main()
{
int num[21];
int len=6;
num[0]=0;
num[1]=1;
num[2]=2;
num[3]=3;
num[4]=5;
num[5]=8;
int num_3=3;
int num_2=2;
while(len<=20)
{
num[len]=num_2*2+num_3*3;
int flag=num_3;
num_3=num_2+num_3;
num_2=flag;
len++;
}
int T;
scanf("%d",&T);
while(T--)
{
int N;
scanf("%d",&N);
printf("%d\n",num[N]);
}
return 0;
}
H
注意数据精度
#include<string.h>
#include<stdio.h>
#include<math.h>
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;//n组数据
scanf("%d",&n);
double num[2][105];//存储坐标
for(int i=0; i<n; i++)
scanf("%lf%lf",&num[0][i],&num[1][i]);//存储x,y坐标
double a,b,c;//三角形三条边
int sum=0;//记录总数
int i,j,k;
for(i=0; i<n-2; i++)
for(j=i+1; j<n-1; j++)
for(k=j+1; k<n; k++)
{
a=sqrt((num[0][i]-num[0][j])*(num[0][i]-num[0][j])+(num[1][i]-num[1][j])*(num[1][i]-num[1][j]));
b=sqrt((num[0][i]-num[0][k])*(num[0][i]-num[0][k])+(num[1][i]-num[1][k])*(num[1][i]-num[1][k]));
c=sqrt((num[0][k]-num[0][j])*(num[0][k]-num[0][j])+(num[1][k]-num[1][j])*(num[1][k]-num[1][j]));
if(a*a+b*b>c*c&&a*a+c*c>b*b&&b*b+c*c>a*a)
sum++;
}
printf("%d\n",sum);
}
return 0;
}
I
请学会使用sort函数
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
struct node
{
int left;
int right;
}num[105];
bool cmp(node x,node y)
{
return x.right<y.right;
}
int main()
{
int N;
while(~scanf("%d",&N)&&N)
{
for(int i=0;i<N;i++)
scanf("%d%d",&num[i].left,&num[i].right);
sort(num,num+N,cmp);
int sum=0;//节目数量
int right=-1;//右边界
int i;
for(i=0;i<N;i++)
{
if(num[i].left>=right)
{
sum++;
right=num[i].right;//更新右边界
}
}
printf("%d\n",sum);
}
return 0;
}
J
接收数据时实时更新每个拦截系统所能拦截的最大高度,如果所有拦截系统都无法拦截,就新开一个拦截系统
#include<stdio.h>
#include<string.h>
#include<math.h>
const int maxn=30005;
int main()
{
int N;
while(~scanf("%d",&N))
{
int num[10000];
num[0]=maxn;
int result=0;
for(int i=0;i<N;i++)
{
int flag;
scanf("%d",&flag);
bool is_ok=0;
for(int j=0;j<=result;j++)
{
if(num[j]>flag)
{
num[j]=flag;
is_ok=1;
break;
}
}
if(is_ok==0)
{
result++;
num[result]=flag;
}
}
printf("%d\n",result+1);
}
return 0;
}