第19次CCF CSP认证第一题——线性分类器
题目描述
输入格式
输出格式
样例输入
样例输出
样例解释
子任务
思路描述
在输入完毕之后需要对输入的点进行定位,因为题目中并没有说明A,B两点在直线那一侧,只是说需要将他们分开。将A,B点的位置定位完毕之后就可以根据参数判断那条直线可以将他们完全分隔。
代码描述
#include<iostream>
using namespace std;
int x[1005],y[1005];
char s[1005];
int main()
{
int n,m,a,b,c;;
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>x[i]>>y[i]>>s[i]; //输入点的信息
for(int i=0;i<m;i++)
{
cin>>a>>b>>c; //这三个数是直线的三个参数
//先标定A、B在直线哪侧
int A,B;
//当点的类型是A点时
if(s[0]=='A')
{
if(a+b*x[0]+c*y[0]>0)
A=1,B=-1; //A点在直线上侧,B在直线下侧
else
A=-1,B=1;
}
else
{
if(a+b*x[0]+c*y[0]>0)
A=-1,B=1;
else
A=1,B=-1;
}
int res=1;//这是一个标志位,代表多少点符合分类
for(int j=1;j<n;j++)
{
if(s[j]=='A')
{
if( ((a+b*x[j]+c*y[j])*A)>0 )
res++;
else
break;
}
else if(s[j]=='B')
{
if( ((a+b*x[j]+c*y[j])*B)>0 )
res++;
else
break;
}
}
if(n==res) //当符合点的数量与点总数相等时
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
第19次CCF CSP认证第一题——报数
题目描述
输入格式
样例输入
20
输出格式
2
1
1
0
样例解释
子任务
思路描述
定义了两个函数分别判断报数过程中是7的倍数和含有7的数,在之后的主函数中进行遍历,当报数复合条件时就对相应的人的标记数组加1,这里的用一个数组来记录四个人报的 “特殊数” 的数量。当遍历完成后再分别进行输出即可完成。
代码描述
#include <iostream>
using namespace std;
//这个函数用来判断报数中含有7的数字
bool isSeven(int number)
{
while(number != 0)
{
int x=number%10;
number=number/10;
if(x==7)
{
return true;
}
}
return false;
}
//这个函数用来判断报数中时7的倍数的数字
bool Have_Seven(int number)
{
if(number%7==0)
return true;
else
return false;
}
int main()
{
int n;
int count[4]={0};
int s=0;
cin>>n;
for(int i=1;i<=n;i++)
{
if(isSeven(i)||Have_Seven(i))//跳过的情况
{
n++; //跳过时应将总数+1
count[(i-1)%4]++; //每个人跳过的次数+1
}
else
s++; //如果没有跳过,报数就继续
}
for(int i=0;i<4;i++)
{
cout<<count[i]<<endl;
}
return 0;
}
第18次CCF CSP认证第一题——线性分类器
题目描述
输入格式
输出格式
样例输入
样例输出
样例解释
子任务
思路描述
这是一道较为简单的题目,在题干中已经指出了运算方式。合理运用二维数组即可完成解体。
代码描述
#include <iostream>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int T=0,k=0,P=0;
int a[1005],dp[1005][1005]; //数组a[]是苹果数,dp[][]是蔬果数
for(int i=0;i<n;i++)
{
cin>>a[i];
T=T+a[i]; //计算所有苹果总数
int temp=0;
for(int j=0;j<m;j++)
{
cin>>dp[i][j];
T=T+dp[i][j]; //计算蔬果后的苹果总数
temp-=dp[i][j]; //计算总蔬果数,并取绝对值
if(P<temp)
{
P=temp; //确定所有树的最大蔬果数
k=i+1; //确定最大蔬果数的树的编号
}
}
}
cout<<T<<" "<<k<<" "<<P;
return 0;
}
第16次CCF CSP认证第一题——小中大
题目描述
输入格式
输出格式
样例输入
3
-1 2 4
样例输出
4 2 -1
样例解释
4为最大值,2为中位数,-1为最小值
子任务
思路描述
本题乍一看很简单,但是需要考虑全面。先分情况讨论最大值与最小值,再分两种情况求得中位数。题目中要求的是如果有分数要四舍五入成小数,这时就要判断中位数是否为整数,再分情况得出结果。
代码描述
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
int n;
int a[108000];
int max,min;
double mid;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
//如果数组是降序
if(a[n-1]>a[0])
{
max=a[n-1];
min=a[0];
}
//如果数组是升序
else
{
max=a[0];
min=a[n-1];
}
//当数据个数为奇数
if(n%2==1)
{
double t=1.0;
mid=a[n/2]*t;
}
//当数据个数为偶数
else
{
double t=1.0;
mid=t*(a[n/2-1]+a[n/2])/2;
}
//这里的判断尤为重要,判断中位数是不是整数
if(mid-int(mid)==0)
printf("%d %d %d",max,(int)mid,min);
else
printf("%d %.1f %d",max,mid,min);
}