协会文化宣传月活动之计算机系程序设计大赛复现讲解

可能比较简单,本文仅面向该次活动的参与者
很庆幸在没有经费的来了这么一点点协会驻地的维护经费,本次讲解复现为协会文化宣传活动的内容,系热身赛与正式赛试题复现,因较简单,仅面向该次参赛者,所以就不放题面了,讲解如下:
热身赛

problem A

cout<<"hello, world"<<endl;

problem B
该题类似于计算机等级考试,蓝桥杯小题那种风格

#include<bits/stdc++.h>
using namespace std;
const double _f=sqrt(5);
const double _ff=(1+_f)/2;
const double _fff=(1-_f)/2;
const int modd=10000;
int a[modd];
int main(){
  int ans=0;
  for(int i=10000;i<100000;i++){
    int n=i;
    int sum=0;
    while(n!=0){
      int num=n%10;
      n/=10;
      sum+=pow(num,5);
    }
    if(sum==i) {
      a[ans++]=sum;
    }
   }
   cout<<ans<<endl;
   for(int i=0;i<ans;i++) cout<<a[i]<<" "; 
   return 0;
}

Problem C
这个题目数据弱,范围比较小,其实不做排序都没有关系。

#include<bits/stdc++.h>
using namespace std;
const double _f=sqrt(5);
const double _ff=(1+_f)/2;
const double _fff=(1-_f)/2;
const int modd=10000;
int a[modd];
int main(){
 int t;
 cin>>t;
 while(t--){
  int n,m;
  cin>>n>>m;
  int flag=0;
  for(int i=0;i<n;i++) cin>>a[i];
  sort(a,a+n);
  for(int i=0;i<n;i++){
   for(int j=i++;j<n;j++)
    if(a[i]+a[j]==m) flag=1;
  }
  if(flag) cout<<"T"<<endl;
  else cout<<"F"<<endl; 
 }
 return 0;
}

Problem D
没啥好说的,可能是叫模拟题

#include<bits/stdc++.h>
using namespace std;
const double _f=sqrt(5);
const double _ff=(1+_f)/2;
const double _fff=(1-_f)/2;
const int modd=10000;
int a[modd];
int main(){
 int t;
 cin>>t;
 while(t--){
  int n,m;
  cin>>n>>m;
  int sum=0;
  for(int i=0;i<n;i++) {
   int x;
   cin>>x;
   sum+=x; 
  }
  n=m/sum;
  if(m%sum!=0) n++;
  cout<<n<<endl;  
 }
 return 0;
}

Problem E
应该没错的。。。
Problem F

#include<bits/stdc++.h>
using namespace std;
const double _f=sqrt(5);
const double _ff=(1+_f)/2;
const double _fff=(1-_f)/2;
const int modd=10000;
int a[modd];
int main(){
 int t;
 cin>>t;
 while(t--){
  int n,m;
  cin>>n;
  cin>>m;
  int ans=0;
  for(int i=1;i<n;i++) {
   int x;
   cin>>x;
   if(m>=x){
    m+=x;
    ans++;
   } 
  }
  cout<<ans<<endl;  
 }
 return 0;
}

Problem G
这是个常识,大家要有印象,大小写隔了个码值32 其实一般减一下就比较规范。

#include<bits/stdc++.h>
using namespace std;
const double _f=sqrt(5);
const double _ff=(1+_f)/2;
const double _fff=(1-_f)/2;
const int modd=10000;
int a[modd];
int main(){
 int t;
 cin>>t;
 getchar();
 while(t--){
  string s;
  getline(cin,s);
  for(int i=0;i<s.length();i++){
   if(s[i]<'a') cout<<char(s[i]+32);
   else cout<<char(s[i]-32);
  }
  cout<<endl;
 }
 return 0;
}

Problem H
这好像是个啥数列,小学数学题。

#include<bits/stdc++.h>
using namespace std;
const double _f=sqrt(5);
const double _ff=(1+_f)/2;
const double _fff=(1-_f)/2;
const int modd=310;
int a[modd];
void shabi(){
 for(int i=1;i<modd;i++) a[i]=a[i-1]+i; 
 for(int i=1;i<modd;i++) a[i]+=a[i-1];
 return;
}
int main(){
 int t;
 cin>>t;
 shabi();
 while(t--){
  int n;
  cin>>n;
  cout<<a[n]<<endl;
 }
 return 0;
}

虽然这里把数提前处理好了跟边做边处理没区别,但希望大家有这个意识。

Problem I
数字小怎么做都可以,想说的还是跟之前的一样。

#include<bits/stdc++.h>
using namespace std;
const double _f=sqrt(5);
const double _ff=(1+_f)/2;
const double _fff=(1-_f)/2;
const int modd=1010;
bool a[modd];
void shabi(){
 for(int i=2;i<sqrt(modd);i++){
  if(a[i]==0) for(int j=2;j*i<modd;j++) a[i*j]=1;
 }
 return;
}
int main(){
 int t;
 cin>>t;
 shabi();
 while(t--){
  int n;
  cin>>n;
  for(int i=1;i<=sqrt(n);i++) 
   if(!(n%i)){
    if(a[i]==0&&a[n/i]==0){
     cout<<n/i<<endl;
     break;
    }else continue; 
   }
 }
 return 0;
}

不过题目的问题,考虑不到非质数乘积的情况。其实应该是分解成任意个质数。

Problem J
其实应该算是想考了排序,本文就不浪费这个时间了。

#include<bits/stdc++.h>
using namespace std;
const double _f=sqrt(5);
const double _ff=(1+_f)/2;
const double _fff=(1-_f)/2;
const int modd=1010;
int a[modd];
int main(){
 int t;
 cin>>t;
 while(t--){
  int n;
  cin>>n;
  for(int i=1;i<=n;i++) cin>>a[i]; 
  sort(a+1,a+n+1);
  for(int i=1;i<n;i++) cout<<a[i]<<" ";
  cout<<a[n]<<endl;
 }
 return 0;
}

正式赛
Problem A
可能算是数学题

#include<bits/stdc++.h>
using namespace std;
const double _f=sqrt(5);
const double _ff=(1+_f)/2;
const double _fff=(1-_f)/2;
const int modd=1010;
int main(){
 int t;
 cin>>t;
 getchar();
 while(t--){
  int ans=0;
  int a;
  for(int i=0;i<4;i++){
   a=getchar()-'0';
   if(i==0){
    if(a<=4) a+=10;
    ans+=abs(9-a);
    continue;
   }
   if(i==3){
    ans+=abs(4-a);
    continue;
   }else{
    if(a==0) ans+=4;
    else ans+=abs(6-a);
   }  
  }
  getchar();
  cout<<ans<<endl;
 }
 return 0;
}

Problem B
因为可以拆,贪心

#include<bits/stdc++.h>
using namespace std;
const double _f=sqrt(5);
const double _ff=(1+_f)/2;
const double _fff=(1-_f)/2;
const int modd=10100;
struct shabi{
 int v;
 int w;
 double c;
}a[modd];
bool cmp(shabi x,shabi y){
 return x.c>y.c;
} 
int main(){
 int t;
 cin>>t;
 while(t--){
  int n,m;
  int ans=0;
  cin>>n>>m;
  for(int i=0;i<n;i++){
   cin>>a[i].w>>a[i].v;
   a[i].c=a[i].v/a[i].w;
  }
  sort(a,a+n,cmp);
  for(int i=0;m>0;i++){
   if(m>a[i].w){
    ans+=a[i].v;
    m-=a[i].w;
   }else {
    ans+=a[i].c*m;
    m=0; 
   } 
  }
  cout<<ans<<endl;
 }
 return 0;
}

Problem C
就是跟之前有题一样的边读边输。但是应该需要中文编码吧,感觉有点毒瘤,大概是自己太菜了。

Problem D
得仔细读题

#include<bits/stdc++.h>
using namespace std;
const double _f=sqrt(5);
const double _ff=(1+_f)/2;
const double _fff=(1-_f)/2;
const int modd=10100;
int ans[100];
int main(){
 queue<int> a;
 int t;
 cin>>t;
 while(t--){
  int n;
  cin>>n;
  int nn=n;
  for(int i=1;i<=n;i++){
   if(i<=nn) cin>>ans[i];
   if(i%2) {
    a.push(ans[i]);
   
   }else ans[++n]=ans[i];  
  }
  
  while(!a.empty()){ 
   cout<<a.front()<<" ";
   a.pop(); 
  }
 }
 return 0;
}

Problem E
还是仔细读题,就是有点绕,其实也没什么东西

#include<bits/stdc++.h>
using namespace std;
const double _f=sqrt(5);
const double _ff=(1+_f)/2;
const double _fff=(1-_f)/2;
const int modd=10100;
string a[modd];
int aa[10];
int num[100]={1,4,5,9,10,40,50,90,100,400,500,900,1000};
int main(){
 a[1]="I";
 a[4]="IV";
 a[5]="V";
 a[9]="IX";
 a[10]="X";
 a[40]="XL";
 a[50]="L";
 a[90]="XC";
 a[100]="C";
 a[400]="CD";
 a[500]="D";
 a[900]="CM";
 a[1000]="M";
 //cout<<a[4];
 int t;
 cin>>t;
 while(t--){
  string str;
  int n;
  cin>>n;
  int ans=1;
  while(n>0){
   aa[ans++]=n%10;
   n/=10;
  }
  for(int i=ans-1;i>0;i--){
   for(int k=i-1;k>0;k--) aa[i]=aa[i]*10;
  }
  for(int i=ans-1;i>0;i--) {
   for(int j=0;j<30;j++){
    if(aa[i]>=1000){
     str+=a[1000];
     aa[i]-=1000;
     i++;
     continue;
    } 
    if(aa[i]>=num[j]&&aa[i]<num[j+1]){
     str=str+a[num[j]];
     aa[i]-=num[j];
     j--;
     i++; 
    } 
   }
  }
  cout<<str<<endl;
 }
 return 0;
}

Problem F
乍看上去貌似是个数学题,找规律 貌似不是还没那么高级,就填数,然后加。

#include<bits/stdc++.h>
using namespace std;
const double _f=sqrt(5);
const double _ff=(1+_f)/2;
const double _fff=(1-_f)/2;
const int modd=300;
int a[modd][modd];
int main(){
 int t;
 cin>>t;
 while(t--){
  memset(a,0,sizeof(a));
  int n;
  int sum=0;
  cin>>n;
  for(int i=1;i<=sqrt(n);i++){
   for(int j=1;j<=sqrt(n);j++) a[i][j]=300;  
  }
  int ans=1,i=1,j=1;
  while(ans<=n){
   while(a[i][j]>ans){
    a[i][j]=ans;
    ans++;
    j++;
   }
   j--;
   i++;
   while(a[i][j]>ans){
    a[i][j]=ans;
    ans++;
    i++; 
   }
   i--;
   j--;
   while(a[i][j]>ans){
    a[i][j]=ans;
    ans++;
    j--; 
   } 
   j++;
   i--;
   while(a[i][j]>ans){
    a[i][j]=ans;
    ans++;
    i--; 
   } 
   i++;
   j++; 
  }
  for( i=1;i<=sqrt(n);i++)
   for(j=1;j<=sqrt(n);j++)
    if(i==j) sum+=a[i][j]; 
  cout<<sum<<endl;
 }
 return 0;
}

Problem G
就是读题模拟吧

#include<bits/stdc++.h>
using namespace std;
const double _f=sqrt(5);
const double _ff=(1+_f)/2;
const double _fff=(1-_f)/2;
const int modd=300;
int a[modd][modd];
int main(){
 int t;
 cin>>t;
 getchar();
 while(t--){
  string s;
  getline(cin,s);
  int flag=1;
  for(int i=0;i<s.length()/2;i++){
   if(s[i]!=s[s.length()-1-i]) flag=0; 
  }
  if(flag) cout<<"Yes"<<endl;
  else cout<<"No"<<endl;
 }
 return 0;
}

Problem H
如果有没做出来的,很不应该,裸的fibonacci数列

#include<bits/stdc++.h>
using namespace std;
const double _f=sqrt(5);
const double _ff=(1+_f)/2;
const double _fff=(1-_f)/2;
const int modd=55;
long long f[modd];
void shabi(){
 f[1]=1;
 f[2]=1;
 for(int i=3;i<modd;i++) f[i]=f[i-1]+f[i-2];
 return;
}
int main(){
 int t;
 shabi();
 cin>>t;
 while(t--){
  int n;
  cin>>n;
  cout<<f[n]<<endl;
 }
 return 0;
}

Problem I
数字并不一定真的是数字

#include<bits/stdc++.h>
using namespace std;
const double _f=sqrt(5);
const double _ff=(1+_f)/2;
const double _fff=(1-_f)/2;
const int modd=55;
int f[modd];
int main(){
 int t;
 cin>>t;
 getchar(); 
 while(t--){
  string s;
  getline(cin,s);
  reverse(s.begin(),s.end());
  int len=s.length();
  for(int i=0;i<len;i++){
   if(s[i]!='0') {
    len=i;
    break; 
   }
  }
  for(int i=len;i<s.length()-1;i++) cout<<s[i];
  cout<<s[s.length()-1]<<endl;
 }
 return 0;
}

Problem J
本来应该是想考dp的吧,但是字符串长度范围小,怎么做都ok

#include<bits/stdc++.h>
using namespace std;
const double _f=sqrt(5);
const double _ff=(1+_f)/2;
const double _fff=(1-_f)/2;
const int modd=55;
int f[modd];
bool a[30]; 
int main(){
 int t;
 cin>>t;
 getchar(); 
 while(t--){
  memset(a,0,sizeof(a));
  int ans=0;
  int num=0;
  string s;
  getline(cin,s);
  for(int i=0;i<s.length();i++){
   int nn=s[i]-'a';
   if(!a[nn]){
    a[nn]=1; 
    ans++;
   } 
   else {
    if(ans>num) num=ans;
    ans=0;
    i--;
    memset(a,0,sizeof(a));
   }
   if(i==s.length()-1) num=max(ans,num);
  }
  cout<<num<<endl;
 }
 return 0;
}

总之这些题就读题仔细点吧。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值