可能比较简单,本文仅面向该次活动的参与者
很庆幸在没有经费的来了这么一点点协会驻地的维护经费,本次讲解复现为协会文化宣传活动的内容,系热身赛与正式赛试题复现,因较简单,仅面向该次参赛者,所以就不放题面了,讲解如下:
热身赛
problem A
cout<<"hello, world"<<endl;
problem B
该题类似于计算机等级考试,蓝桥杯小题那种风格
#include
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
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
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
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
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
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
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
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
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
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
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
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<
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
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
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
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
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
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;
}
总之这些题就读题仔细点吧。