2019年广东工业大学新生赛


做题网站

A-原初的信纸

这道题用到了快排

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e4+10;
int s[maxn];
int t;
int n;
int main(){
    cin>>t;
    while(t--){
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>s[i];
    sort(s+1,s+1+n,greater<int>());
    cout<<s[1]<<endl;
    }
    return 0;
}

B-骑士的对决

这道题知识点是枚举和暴力
我一开始写的稍微麻烦一点

#include<iostream>
#include<algorithm>
using namespace std;
char a,b,c;
int main(){
	cin>>a>>b;
	cin>>c;
	if((a=='S'&&b=='J'&&c=='S')||(a=='J'&&b=='S'&&c=='S')||(a=='S'&&b=='B'&&c=='B')||(a=='B'&&b=='S'&&c=='B')||(a=='J'&&b=='B'&&c=='J')||(a=='B'&&b=='J'&&c=='J'))
	cout<<"lyrnb"<<endl;
	else
	cout<<"pmznb"<<endl;
	return 0;
}

C-秘密的议会

#include<iostream>
#include<cstring>
using namespace std;
int t,sum,num;
string s;
int main(){
	cin>>t;
	while(t--){
		sum=num=0;
		cin>>s;
		for(int i=0;i<s.length();i++){
			if(s[i]=='Y'||s[i]=='y')
			sum++;
			if(s[i]=='N'||s[i]=='n')
			num++;
		}
		if(sum>=s.length()/2)
		cout<<"pmznb"<<endl;
		else if(num>=s.length()/2)
		cout<<"lyrnb"<<endl;
		else
		cout<<"wsdd"<<endl;
	}
	return 0;
}

D-城市的税金

我看给这道题知识点的标签是dp的优化、冒泡排序、2-sat、ac自动机、简单排序这几个知识,可我没有用到。
这道题如果操作为1,就正常区间操作
操作为2,有点意思,要求输出区间中数量最多的值
我想的是直接用map存储,然后操作
熟悉一下map的操作
链接

#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
typedef long long ll;
const int maxn=1e3+10;
int n,m;
ll max_=0;
map<ll,int> q;
int a,l,r;
ll s[maxn];
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	scanf("%lld",&s[i]);
	while(m--){
	cin>>a>>l>>r;
	if(a==2){
		max_=-1;
		for(int i=l;i<=r;i++){
			q[s[i]]++;
		}
		for(map<ll,int>::iterator it=q.begin();it!=q.end();it++){
			if(max_<it->second)
			max_=it->second;
		}
		q.clear();
		cout<<max_<<endl;
	}
	if(a==1){
		for(int i=l;i<=r;i++){
			s[i]=s[i]*251%996*404*123;
		}
	}	
	}
	return 0;
}

E-缺席的神官

题目
:祭司决定这段时间内只选出k个连续的时间段去神庙工作,把点名的日子纳入工作的日子当中的同时又尽可能的偷懒。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=2e3+10;
int n,k;
ll m;
ll s[maxn];
ll a[maxn];
int main(){
	scanf("%d%lld%d",&n,&m,&k);
	int x=0;
	for(int i=1;i<=n;i++)
	scanf("%lld",&s[i]);
	for(int i=n;i>=2;i--){
//		cout<<i<<" ";
		a[i-1]=s[i]-s[i-1]-1; //75-80  76 77 78 79
		++x;
	}
//	for(int i=1;i<=n;i++)
//	cout<<a[i]<<endl;
	sort(a+1,a+1+x);
	ll sum=0;
	for(int i=1;i<=x-k+1;i++){
		sum+=a[i];
//		cout<<sum<<endl;
	}
	sum+=n;
	cout<<sum<<endl;
	return 0;
}

G-虚数的纸牌

枚举和暴力
3带1和3带2比较难

#include<iostream>
#include<map>
using namespace std;
int n,t;
string s;
int sum;
int main(){
	cin>>t;
	while(t--){
		map<char,int> q;
		cin>>s;
		sum=17;
		int sum3=0,sum2=0,sum4=0,sum1=0;
		for(int i=0;i<s.length();i++)
			q[s[i]]++;
		for(map<char,int>::iterator it=q.begin();it!=q.end();it++){
				if(it->second==4)
		        sum4++;
		        if(it->second==3)
		        sum3++;
		        if(it->second==2)
		        sum2++;
		        if(it->second==1)
		        sum1++;
//		        cout<<it->first<<" "<<it->second<<endl;
		}		
//  cout<<sum1<<" "<<sum2<<" "<<sum3<<" "<<sum4<<endl;
//  cout<<sum<<endl;
		sum+=sum4+sum4*6+sum2+sum3*3;//bomb duizi
		sum+=4*sum4*(sum1+sum2*2+sum3*3+(sum4-1)*4);//3-1
		sum+=sum3*(sum1+sum2*2+(sum3-1)*3+sum4*4);
		sum+=4*sum4*(sum2+sum3*3+(sum4-1)*6);//3-2
		sum+=sum3*(sum2+(sum3-1)*3+sum4*6);
		sum+=q['3']*q['4']*q['5']*q['6']*q['7'];
		sum+=q['4']*q['5']*q['6']*q['7']*q['8'];
		sum+=q['5']*q['6']*q['7']*q['8']*q['9'];
		sum+=q['6']*q['7']*q['8']*q['9']*q['0'];
		sum+=q['7']*q['8']*q['9']*q['0']*q['J'];
		sum+=q['8']*q['9']*q['0']*q['J']*q['Q'];
		sum+=q['9']*q['0']*q['J']*q['Q']*q['K'];
		sum+=q['0']*q['J']*q['Q']*q['K']*q['A'];
		sum+=q['J']*q['Q']*q['K']*q['A']*q['2'];
			cout<<sum<<endl;
	}
	return 0;
}

H-绵羊的银币

知识点:斐波那契数列 + 规律
所以首先要补一下斐波那契数列的知识点
也称黄金数列
只这样一个数列:1、1、2、3、5、8、13…
定义:F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2)
斐波那契数列很大,到60就得long long
有题意得
f[n]=f[n/2]+f[n/4]=2f[n/4]+f[n/8]=3f[n/8]+2f[n/16]=5f[n/16]+3f[n/32]
以此类推:

=fi(k+1)f[n/(2^k)]+fi(k)fn[n/(2 ^k+1)]
当f[n/(2^k)]=1时,f[n/(2 ^k+1)]=0;
所以等于fi(k+1)

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const int maxn=70;
ll s[maxn];
int t;
ll n;
ll p;
int main(){
	s[1]=1;
	for(int i=2;i<=60;i++)
	s[i]=s[i-1]+s[i-2];
	cin>>t;
	while(t--){
		int sum=0;
		scanf("%lld",&n);
		p=1;
		while(p<=n){
			p*=2;
			sum++;
		}
		printf("%lld\n",s[sum]);
	}
	return 0;
}

I-迷途的怪物

本题知识点:排列组合数学、快速幂、数论
有题意得p为质数,p-1为合数,当n为奇数时一定为p-1,当n为偶数时一定为1
有时候以特例带通例

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
int t;
ll p;
int main(){
	cin>>t;
	while(t--){
		string s;
		scanf("%lld",&p);
		cin>>s;
		if((s[s.length()-1]-'0')%2)
		cout<<p-1<<endl;
		else
		cout<<"1"<<endl;
	}
	return 0;
}

模运算规律:

(a + b) % p = (a % p + b % p) % p

(1) (a - b) % p = (a % p - b % p) % p

(2) (a * b) % p = (a % p * b % p) % p

(3) a ^ b % p = ((a % p)^b) % p

(4) 结合律: ((a+b) % p + c) % p = (a + (b+c) % p) % p

(5) ((ab) % p * c)% p = (a * (bc) % p) % p

(6) 交换律: (a + b) % p = (b+a) % p

(7) (a * b) % p = (b * a) % p

(8) 分配律: ((a +b)% p * c) % p = ((a * c) % p + (b * c) % p) % p

重要定理

若a≡b (% p),则对于任意的c,都有(a + c) ≡ (b + c) (%p);

(10) 若a≡b (% p),则对于任意的c,都有(a * c) ≡ (b * c) (%p);

(11) 若a≡b (% p),c≡d (% p),

则 (a + c) ≡ (b + d) (%p),

(a - c) ≡ (b - d) (%p),

(a * c) ≡ (b * d) (%p),

(a / c) ≡ (b / d) (%p);

J-简单的数学

这道题就是纯数学题
知识点给的是:lct、排列组合数学、数学
n!=1 *2 *3 *…*n
n!/(n-1)!=n
x=1能使很多项等于0

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const ll maxn=1e9+10;
int t;
ll n;
int main(){
	cin>>t;
	while(t--){
		scanf("%d",&n);
		if(n%2){
			printf("%lld\n",n*(n+1));
		}
		else 
		    printf("%lld\n",-n*(n+1));
	}
	return 0;
}

K-消亡的质数

知识点标签:AC自动机、数学
由题已知:p=a^3- b^3
立方差公式:a^3- b^3=(a-b) (a^2 + ab + b^2)
因为p是质数
若a、b为偶数或a、b为奇数,(a-b)为偶数,p一定为偶数
若a为偶数、b为奇数,(a-b)为奇数,a^2为偶数,a
b为偶数, b^2 为奇数,两个偶数加上一个奇数还是奇数,奇数乘奇数还是偶数
都与题意不符

#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
int t;
ll p;
int solve(ll p){
	ll i;
	for(i=1;i*i+i*(i+1)+(i+1)*(i+1)<=p;i++){
		if(i*i+i*(i+1)+(i+1)*(i+1)==p)
		return 1;
	}
	return 0;
}
int main(){
	cin>>t;
	while(t--){
		scanf("%lld",&p);
		if(solve(p))
		cout<<"YES"<<endl;
		else
		cout<<"NO"<<endl;
	}
return 0;
}

L-危险的台阶

知识点给的数学,不太会

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
int n;
ll m,l;
ll a;
int sum;
double s;
int main(){
	cin>>n;
	scanf("%lld%lld",&l,&m);
//	a=1;
//	while(a<=l){
//		a*=2;
//		sum++;
//	}
    int j=2;
	for(int i=1;i<=n;i++){
		s+=(double)l/j;
        j+=2;
	}
	printf("%.4lf\n",s);
	return 0;
}

M-破碎的愿望

知识点标签:lct、思维题
用到了#include<algorithm>下的reverse函数
将字符串反转或者数组反转

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
int main(){
	int s[10];
	for(int i=1;i<=10;i++)
	s[i]=i;
	for(int i=1;i<=10;i++)
	cout<<s[i]<<" ";
	reverse(s+1,s+11);
	cout<<endl;
	for(int i=1;i<=10;i++)
	cout<<s[i]<<" ";
	return 0;
}

本题代码

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=60+5;
int n;
ll k;
 string a,b;
int main(){
	cin>>n;
	scanf("%lld",&k);
	cin>>a;
	b=a;
	reverse(a.begin(),a.begin()+n);
	b+=a;
//	cout<<b<<endl;
	cout<<b[(k-1)%(2*n)]<<endl;
	return 0;
}
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值