第十一届蓝桥杯大赛软件类省赛第二场C/C++大学B组(10月17日)
发表时间:2020-10-18
发布人:葵宇科技
浏览次数:84
签到题:答案624
#include<iostream>
using namespace std;
int sum;
void jisuan(int x){
while(x){
if(x%10==2) sum++;
x/=10;
}
}
int main()
{
for(int i=1;i<=2020;i++) jisuan(i);
cout<<sum<<endl;
return 0;
}
答案:2481215
暴力枚举分子分母即可。
#include<iostream>
using namespace std;
int sum=0;
int gcd(int x,int y){
if(x%y==0) return y;
return gcd(y,x%y);
}
int main()
{
for(int i=1;i<=2020;i++)
for(int j=1;j<=2020;j++)
if(gcd(i,j)==1) sum++;
cout<<sum<<endl;
return 0;
}
答案:761
解析:找规律题,不难发现对角线上的数字个数是一个1-n的等差数列,且第n行m列的数所在对角线上有n+m-1个数字,对角线上的数字为奇数时蛇形矩阵方向向上;n(n+1)/2+x
答案:8879
总的天数+月初且不是周一的天数+周一的天数
#include<iostream>
using namespace std;
int sum=0,s=0;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
for(int i=2000;i<2020;i++){
if(i%4==0&&i%100!=0||i%400==0) month[2]++;
for(int i=1;i<=12;i++){
if((sum+6)%7!=1) s++;//计算是月初且不是周一的日子
sum+=month[i];
}
if(month[2]==29) month[2]--;
}
month[2]++;
for(int i=1;i<=9;i++){ //2020年的前9个月
sum+=month[i];
if((sum+6)%7!=1) s++;
}
sum+=2;//加上2020.10.1日
int z=sum+s+(sum-2+6)/7;
cout<<z<<endl;
return 0;
}
答案:80
7!种组合
暴搜每种组合,然后使用并查集或者搜索判断是否在一个连通块
#include<iostream>
using namespace std;
int main()
{
double n;
cin>>n;
double jg=0,yx=0;
int x;
int s=n;
while(s--){
cin>>x;
if(x>=60) jg++;
if(x>=85) yx++;
}
int j=((jg/n+0.005)*100),y=((yx/n+0.005)*100);
cout<<j<<"%\n"<<y<<"%";
return 0;
}
关键在于判断月份在1-12之间,天数不能越界
**关键在于判断月份在1-12之间,天数不能越界**
#include<iostream>
using namespace std;
int a;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
cin>>a;
a=a/10000;
for(int i=a+1;;i++){
if(i%4==0&&i%100!=0||i%400==0) month[2]++;
int month1=(i%10)*10+(i/10)%10,day1=((i/100)%10)*10+i/1000;
if(month[month1]>=day1&&month1>0&&month1<=12) {
int year=i*10000+month1*100+day1;
cout<<year<<endl;
break;
}
if(month[2]==29) month[2]--;
}
for(int i=a+1;;i++){
if(i/100!=i%100) continue;
if(i%4==0&&i%100!=0||i%400==0) month[2]++;
int month1=(i%10)*10+(i/10)%10,day1=((i/100)%10)*10+i/1000;
if(month[month1]>=day1&&month1>0&&month1<=12) {
int year=i*10000+month1*100+day1;
cout<<year<<endl;
break;
}
if(month[2]==29) month[2]--;
}
return 0;
}
我写的纯暴力不知道能不能过
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
const int N=100010;
string a;
int f[N];
// 纯暴力
int main()
{
cin>>a;
int sum=0;
for(int i=0;i<a.size();i++){
map<char,int>p;
memset(f,0,sizeof f);
for(int j=i;j<a.size();j++) {
if(!p[a[j]]) f[j+1]=f[j]+1;
else f[j+1]=f[j];
sum+=f[j+1];
p[a[j]]=1;
}
}
cout<<sum<<endl;
return 0;
}
这道题的规律是每加入一条直线与其他直线有k个交点,即多产生k+1个区域(仅供参考)
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int n;
//这道题的规律是每加入一条直线与其他直线有k个交点,即多产生k+1个区域
struct point{
int i,j;
/* bool operator <(const point& t) const
{
if(i!=t.i) return i<t.i;
return j<t.j;
}
*/
}p[1010];
int main()
{
cin>>n;
for(int i=0;i<n;i++) scanf("%d%d",&p[i].i,&p[i].j);
// sort(p,p+n);
int sum=2;
for(int i=1;i<n;i++){
sum++;
map<int,int>q;//存储当前直线与前面的直线的交点
for(int j=0;j<i;j++)
if(p[j].i!=p[i].i){
int x=(p[j].j-p[i].j)/(p[i].i-p[j].i);//x=(b1-b2)/(a2-a1)
int y=p[i].i*x+p[i].j+1; //+1是为了特判y==0的情况
// cout<<x<<" "<<q[x]<<endl;
// cout<<x<<" "<<y<<endl;
if(q[x]!=y) sum++; //出现新的交点即++
q[x]=y; //存储当前交点
}
}
cout<<sum<<endl;
return 0;
}
目前还没有思路(太菜了!!!)