太弱鸡了,所以只有4题。(C题最难,没有之一)
A. 给你一个数字x,问能不能补充几个前导零使得他变成回文数(可以补充0个前导零)
模拟题
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#define LiangJiaJun main
#define pa pair<int,int>
#define INF 1999122700
using namespace std;
string s;
int l,n;
int LiangJiaJun(){
cin>>s;
l=s.size();
for(int t=0;t<=l;t++){
n=s.size();
bool fe=0;
for(int i=0,j=n-1;i<=j;i++,j--)if(s[i]!=s[j]){fe=1;break;}
if(!fe)return puts("YES"),0;
s='0'+s;
}
puts("NO");
return 0;
}
B.给你2*n个人,n-1艘大船,2艘小船,一艘小船必须载1人,一艘大船必须载2人,大船的不稳的系数为载的两个人的体重之差。小船都是稳定的,求问不稳的系数的总和最小是多少。(n<= 50 , | 体重 |<=1000)
枚举哪两个人要坐小船,剩下的人从小到大排序,两两相邻的坐一起
C.A和B猜拳,1,2,3分别代表锤子剪刀布。给两个九宫格a和b。共K次游戏,每次赢的得一分,输的不得分,平局都不得分,如果当前A出了i , B出 j ,那么下一局中A 会出a[i][j] , B 会出b[i][j] 求问K局之后,A,B 各多少分。
k<=10^18
找规律的题目,挺恶心的
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#define LiangJiaJun main
#define pa pair<int,int>
#define INF 1999122700
using namespace std;
long long k,s1=0,s2=0,ans1=0,ans2=0;
int a,b,na,nb,be=-1;
vector<pa>c;
int mp1[4][4],mp2[4][4],td[4][4];
int LiangJiaJun(){
td[1][2]=td[1][1]=td[2][3]=td[2][2]=td[3][1]=td[3][3]=0;
td[1][3]=td[2][1]=td[3][2]=1;
cin>>k>>a>>b;
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)cin>>mp1[i][j];
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)cin>>mp2[i][j];
c.push_back(make_pair(a,b));
for(int i=1;i<k;i++){
int x=c[c.size()-1].first,y=c[c.size()-1].second;
na=mp1[x][y];nb=mp2[x][y];
for(int j=0;j<c.size();j++)
if(na==c[j].first&&nb==c[j].second){
be=j;break;
}
if(be!=-1)break;
c.push_back(make_pair(na,nb));
}
if(be==-1){
for(int i=0;i<c.size();i++){
ans1+=td[c[i].first][c[i].second];
ans2+=td[c[i].second][c[i].first];
}
cout<<ans1<<" "<<ans2<<endl;
return 0;
}
int l=c.size()-be;
for(int i=0;i<be;i++){
k--;
ans1+=td[c[i].first][c[i].second];
ans2+=td[c[i].second][c[i].first];
}
for(int i=be;i<c.size();i++){
s1+=td[c[i].first][c[i].second];
s2+=td[c[i].second][c[i].first];
}
ans1+=s1*(k/l);
ans2+=s2*(k/l);
for(int i=be;i<be+(k%l);i++){
ans1+=td[c[i].first][c[i].second];
ans2+=td[c[i].second][c[i].first];
}
cout<<ans1<<" "<<ans2<<endl;
return 0;
}
D.给一个序列,长度n,共有q次操作,每次操作三个数t,l,r。如果t==1,那么将下标∈[l,r]的所有数字向右移动一位,下标为r的那个数字移到l;如果t==2,将序列[l,r]翻转。m个询问,每次询问一个x,询问做完这些操作后下标为x 的位置上那个数是多少。
n,q <=2*10^5 ,m<=100
看见m的范围就知道直接暴力了。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#define LiangJiaJun main
#define pa pair<int,int>
#define INF 1999122700
using namespace std;
struct data{int p,l,r;}a[200004];
int n,b[200004],x,q,m;
int LiangJiaJun(){
scanf("%d%d%d",&n,&q,&m);
for(int i=1;i<=n;i++)scanf("%d",&b[i]);
for(int i=1;i<=q;i++)scanf("%d%d%d",&a[i].p,&a[i].l,&a[i].r);
for(int t=1;t<=m;t++){
scanf("%d",&x);
for(int i=q;i>=1;i--){
if(!(a[i].l<=x&&x<=a[i].r))continue;
if(a[i].p==1){
if(x==a[i].l)x=a[i].r;
else x--;
}
else x=a[i].r-x+a[i].l;
}
printf("%d ",b[x]);
}
puts("");
return 0;
}