做题网站
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为偶数,ab为偶数, 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;
}