这里写自定义目录标题
H题 水题无疑
#include<iostream>
using namespace std;
int main(){
long long int n;cin>>n;
int tempn=n-1;
long long int k=(n*tempn)/2;
cout<<k;
return 0;
}
B题 同样水题无疑 ,问题问能否整除,显然可以知道,整除的前提是需要零,又有常识0除任何数为零
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int a[10];
int main(){
int n;cin>>n;
int k;
while(n--){
cin>>k;
a[k]++;
}
if(a[0]){
cout<<"Yes";
}
else{
cout<<"No";
}
return 0;
}
A题 题目告知很明显。按要求模拟即可。需要自己尝试调试样例没给出的操作
#include<iostream>
#include<algorithm>
#include<string>
#include<map>
#include<queue>
using namespace std;
char a [105][105];
int n;
char judge(int k,int i){
if(a[k][i]>='a'&&a[k][i]<='z')
{
a[k][i]-=('a'-'A');
}
else {
a[k][i]+=('a'-'A');
}
return a[k][i];
}
void clockwise_rotation(int k){
if(k==(n+1)/2&&(n%2)){
a[k][k]=judge(k,k);
}
char t1=judge(k,k),t2=judge(k,n-k+1),t3=judge(n-k+1,k),t4=judge(n-k+1,n-k+1);
a[k][k]=t3;a[k][n-k+1]=t1;a[n-k+1][k]=t4;a[n-k+1][n-k+1]=t2;
queue<char>one,two,three,four;
for(int i=k+1;i<=n-k;i++){
one.push(judge(k,i));
}
for(int i=k+1;i<=n-k;i++){
two.push(judge(i,n-k+1));
}
for(int i=k+1;i<=n-k;i++){
three.push(judge(n-k+1,i));
}
for(int i=k+1;i<=n-k;i++){
four.push(judge(i,k));
}
for(int i=k+1;i<=n-k;i++){
a[i][n-k+1]=one.front();
one.pop();
}
for(int i=n-k;i>=k+1;i--){
a[n-k+1][i]=two.front();
two.pop();
}
for(int i=k+1;i<=n-k;i++){
a[i][k]=three.front();
three.pop();
}
for(int i=n-k;i>=k+1;i--){
a[k][i]=four.front();
four.pop();
}
}
void anticlockwise_rotation(int k){
char t1=judge(k,k),t2=judge(k,n-k+1),t3=judge(n-k+1,k),t4=judge(n-k+1,n-k+1);
a[k][k]=t2;a[k][n-k+1]=t4;a[n-k+1][k]=t1;a[n-k+1][n-k+1]=t3;
queue<char>one,two,three,four;
for(int i=k+1;i<=n-k;i++){
one.push(judge(k,i));
}
for(int i=k+1;i<=n-k;i++){
two.push(judge(i,n-k+1));
}
for(int i=k+1;i<=n-k;i++){
three.push(judge(n-k+1,i));
}
for(int i=k+1;i<=n-k;i++){
four.push(judge(i,k));
}
for(int i=n-k;i>=k+1;i--){
a[i][n-k+1]=three.front();
three.pop();
}
for(int i=k+1;i<=n-k;i++){
a[n-k+1][i]=four.front();
four.pop();
}
for(int i=n-k;i>=k+1;i--){
a[i][k]=one.front();
one.pop();
}
for(int i=k+1;i<=n-k;i++){
a[k][i]=two.front();
two.pop();
}
}
void left_shift(int k){
char temp=judge(k,1);
for(int i=1;i<n;i++){
a[k][i]=judge(k,i+1);
}
a[k][n]=temp;
}
void right_shift(int k){
char temp=judge(k,n);
for(int i=n;i>1;i--){
a[k][i]=judge(k,i-1);
}
a[k][1]=temp;
}
void upper_shift(int k){
char temp=judge(1,k);
for(int i=1;i<n;i++){
a[i][k]=judge(i+1,k);
}
a[n][k]=temp;
}
void down_shift(int k){
char temp=judge(n,k);
for(int i=n;i>1;i--){
a[i][k]=judge(i-1,k);
}
a[1][k]=temp;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
int m;cin>>m;
while(m--){
string s;cin>>s;
int k;
if(s=="clockwise_rotation"){
cin>>k;
clockwise_rotation(k);
}
else if(s=="anticlockwise_rotation"){
cin>>k;
anticlockwise_rotation(k);
}
else if(s=="left_shift"){
cin>>k;
left_shift(k);
}
else if(s=="right_shift"){
cin>>k;
right_shift(k);
}
else if(s=="upper_shift"){
cin>>k;
upper_shift(k);
}
else if(s=="down_shift"){
cin>>k;
down_shift(k);
}
else if(s=="print_it!"){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<a[i][j];
}
cout<<endl;
}
}
}
return 0;
}
E题 这题呢我卡了挺久 后面按照全部都是1的情况开始模拟
结果写着写着就过了
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int t;cin>>t;
while(t--){
int finbook[10]={0};
int a,n;cin>>a>>n;
if(a<n*2||a>7*n){
cout<<-1<<endl;
}
else{
finbook[1]=n;
for(int i=2*n;i<a;i++){
int p=1;
if(finbook[1]&&p==1){
finbook[1]--;
finbook[7]++;
p=0;
}
else if(finbook[5]&&p==1){
finbook[5]--;
finbook[9]++;
p=0;
}
else if(finbook[7]==3&&p==1){
finbook[7]=0;
finbook[1]+=2;
finbook[9]++;
p=0;
}
else if(finbook[7]==1&&finbook[4]==1&&p==1){
finbook[7]=0;
finbook[1]+=1;
finbook[4]=0;
finbook[9]++;
p=0;
}
else if(finbook[4]&&p==1){
finbook[4]--;
finbook[5]++;
p=0;
}
else if(finbook[7]&&p==1){
finbook[7]--;
finbook[4]++;
p=0;
}
else if(finbook[9]&&p==1){
finbook[9]--;
finbook[8]++;
p=0;
}
if(finbook[7]>3){
finbook[7]=0;
finbook[9]++;
finbook[1]+=3;
p=0;
}
}
for(int i=9;i>0;i--){
while(finbook[i]){
cout<<i;
finbook[i]--;
}
}
cout<<endl;
}
}
return 0;
}
C题 负责端茶递水的jinli
这题明显求最长公共子串,dp可以解决
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[10005][10005];
char s1[10005],s2[10005];
int main(){
scanf("%s",s1+1);
scanf("%s",s2+1);
int len1=strlen(s1+1);int len2=strlen(s2+1);
for(int i=0;i<=len2;i++){
for(int j=0;j<=len1;j++){
if(i==0||j==0){
a[i][j]=0;
}
else{
if(s2[i]==s1[j]){
a[i][j]=a[i-1][j-1]+1;
}
else{
a[i][j]=0;
}
}
}
}
int maxnn=0;
for(int i=0;i<=len2;i++){
if(maxnn<a[i][len1]){
maxnn=a[i][len1];
}
}
if(maxnn==0){
cout<<len1+len2;
}
else{
cout<<len1-maxnn+len2-maxnn;
}
return 0;
}
D题 sen在玩塞尔达传说
也是模拟,这里我是直接面向百度编程。现学优先队列。
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
int n,m,k,l,p,numm;
struct wuqi{
string name;
int a;
int b;
int num;
friend bool operator < (struct wuqi x,struct wuqi y){
if(x.a==y.a){
if(x.b==y.b){
return x.num>y.num;
}
return x.b>y.b;
}
return x.a>y.a;
}
}qq;
struct dun{
string name;
int c;
int num;
friend bool operator < (struct dun x,struct dun y){
if(x.c==y.c){
return x.num>y.num;
}
return x.c>y.c;
}
}DD;
bool cmp1(wuqi t1,wuqi t2){
return t1.num<t2.num;
}
bool cmp2(dun t1,dun t2){
return t1.num<t2.num;
}
priority_queue<wuqi> wuqiku;
priority_queue<dun> dunku;
void fight(int bi,int yi ,int zi,int wi,string xi,string qi){
wuqi tempwuqi;tempwuqi.b=-999;
dun tempdun;tempdun.c=-999;
bool flag=false;
while(!wuqiku.empty()){
while(tempwuqi.b<=0&&!(wuqiku.empty())){// 拿武器
tempwuqi=wuqiku.top();
wuqiku.pop();
l++;
}
while(tempdun.c<=0&&!dunku.empty()){//拿盾
tempdun=dunku.top();dunku.pop();
p++;
}
bi-=tempwuqi.a;tempwuqi.b-=1;//打一下
if(bi>0){//如果怪没有死,就会用盾去挡
tempdun.c-=yi;
}
if(tempwuqi.b>0){//如果手上武器还有耐力就收起来
wuqiku.push(tempwuqi);
tempwuqi.b=-1;
l--;
}
if(tempdun.c>0){//如果手上盾还有耐力就收起来
dunku.push(tempdun);
tempdun.c=-1;
p--;
}
if(bi<=0){//如果怪死了
if(wi){//如果有盾,收起来
dun guaidun;guaidun.name=qi;guaidun.c=wi;guaidun.num=numm++;
if(p>0){
dunku.push(guaidun);
p--;
}
else if(p==0&&(!dunku.empty())){
if(dunku.top().c<=guaidun.c){
dunku.pop();
dunku.push(guaidun);
}
}
}
wuqi guaiwuqi;guaiwuqi.name=xi;guaiwuqi.a=yi;guaiwuqi.b=zi;guaiwuqi.num=numm++;
if(l==0){//怪物必定有武器,那么判断是否还有位置放武器,这里0空间,则考虑是否替换最低武器
if(wuqiku.top().a<guaiwuqi.a){
wuqiku.pop();
wuqiku.push(guaiwuqi);
}
else if(wuqiku.top().a==guaiwuqi.a){
if(wuqiku.top().b<=guaiwuqi.b){
wuqiku.pop();
wuqiku.push(guaiwuqi);
}
}
}
else{//还有空间,收起怪物武器
wuqiku.push(guaiwuqi);
l--;
}
flag=true;//宣告怪物死亡
break;
}
}
if(!flag){//如果怪物没死,就是我没武器了,那么就是我死,那么清空盾库
while(!dunku.empty()){
dunku.pop();
}
}
}
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
int t;cin>>t;
while(t--){
cin>>n>>m>>k>>l>>p;
l=l-n;
p=p-m;
numm=1;
while(n--){
cin>>qq.name>>qq.a>>qq.b;
qq.num=numm++;
wuqiku.push(qq);
}
while(m--){
cin>>DD.name>>DD.c;
DD.num=numm++;
dunku.push(DD);
}
while(k--){
int bi,yi,zi,wi;
string xi,qi;
cin>>bi>>xi>>yi>>zi>>qi>>wi;
fight(bi,yi,zi,wi,xi,qi);
}
int n1=wuqiku.size();
int n2=dunku.size();
cout<<n1<<endl;
wuqi sumwuqi[30];
for(int i=0;i<n1;i++){
sumwuqi[i]=wuqiku.top();
wuqiku.pop();
}
sort(sumwuqi,sumwuqi+n1,cmp1);
for(int i=0;i<n1;i++){
cout<<sumwuqi[i].name<<endl;
}
cout<<n2<<endl;
dun sumdun[30];
for(int i=0;i<n2;i++){
sumdun[i]=dunku.top();
dunku.pop();
}
sort(sumdun,sumdun+n2,cmp2);
for(int i=0;i<n2;i++){
cout<<sumdun[i].name<<endl;
}
}
return 0;
}
G题 小弟弟的数学题
讲真,这题折磨我很久了,1e5,显然n^2不可以。所以我直接暴力对每个数都提取2和5的因数个数,用二维数组进行表示。然后二维前缀和来匹配是否进位。
Source Code
#include<iostream>
#include<queue>
using namespace std;
struct Zhengshu{
int ans2=0;
int ans5=0;
int len=0;
};
int book2[50][50];
int sum2[50][50];
int book5[50][50];
int book[50];
int sum5[50][50];
int sumyu[50];
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
int n;cin>>n;
long long int zhengshu=0;
long long int sum=0;
int p2=0,p5=0;
queue<Zhengshu> zs;
for(int ii=0;ii<n;ii++){
string s;cin>>s;
int p=-1,p1=0;
bool flag=false;//判断是否为小数
long long int tempz=0,tempx=0;
int len=s.length();
for(int i=0;i<len;i++){
if(s[i]=='.'){
p=i;
break;
}
else {
tempz=tempz*10+s[i]-48;
}
}
for(int i=len-1;i>=p;i--){
if(s[i]=='0'){
continue;
}
else if(s[i]!='.'&&!flag&&p!=-1){//遇到小数点后的非零数,代表为小数,
flag=true;
p1=i;//p1代表小数最后一位的下标
break;
}
}
if(flag){//如果是小数,就补小数为整数
for(int i=0;i<=p1;i++){
if(s[i]!='.'){
tempx=tempx*10+s[i]-48;
}
else{
p=i;
}
}
//p1-p为小数点后长度
int two=0,five=0;
int weishu=p1-p;
if(!(tempx%2)&&tempx){//一个小数只能拥有2或者5其中一个因数
while(!(tempx%2)&&tempx){
tempx/=2;
two++;
}
book2[weishu][two]++;//使用数组存小数;
Zhengshu tempzz;
tempzz.ans5=0;
tempzz.ans2=two;
tempzz.len=weishu;
zs.push(tempzz);
}
else if(!(tempx%5)&&tempx){
while(!(tempx%5)&&tempx){
tempx/=5;
five++;
}
book5[weishu][five]++;
Zhengshu tempzz;
tempzz.ans5=five;
tempzz.ans2=0;
tempzz.len=weishu;
zs.push(tempzz);
}
else{
book[weishu]++;
}
}
if(!flag){//为整数
struct Zhengshu tempzs;
zhengshu++;
int temp3=tempz;
while(!(tempz%5)&&tempz){//统计该整数的5因子
tempz/=5;
tempzs.ans5++;
}
while(!(temp3%2)&&temp3){//统计该整数的2因子
temp3/=2;
tempzs.ans2++;
}
zs.push(tempzs);//整数入队
}
}
for(int i=1;i<50;i++){
for(int j=1;j<50;j++){//前缀和处理
sum2[i][j]=book2[i][j]+sum2[i-1][j]+sum2[i][j-1]-sum2[i-1][j-1];
sum5[i][j]=book5[i][j]+sum5[i-1][j]+sum5[i][j-1]-sum5[i-1][j-1];
}
}
for(int i=1;i<50;i++){
sumyu[i]=book[i]+sumyu[i-1];
}
long long int xscountt=0;
int ans=0;
while(!zs.empty()){
Zhengshu tempzs=zs.front();
zs.pop();
if(tempzs.ans2<tempzs.ans5){
sum+=sum2[tempzs.ans2][49]+sum5[tempzs.ans2][49]+sumyu[tempzs.ans2];
long long int tempsum=0;
for(int i=1;i<=tempzs.ans5-tempzs.ans2;i++){
if(tempzs.len){
if(tempzs.ans2+i-tempzs.len>0){
tempsum=sum2[tempzs.ans2+i-tempzs.len][49]-sum2[tempzs.ans2+i-tempzs.len-1][49]-sum2[tempzs.ans2+i-tempzs.len][i-1]+sum2[tempzs.ans2+i-tempzs.len-1][i-1];
}
}
else{
tempsum=sum2[tempzs.ans2+i][49]-sum2[tempzs.ans2+i-1][49]-sum2[tempzs.ans2+i][i-1]+sum2[tempzs.ans2+i-1][i-1];
}
if(tempsum){//如果是小数,那么tempsum不等于零只能存在另一个小数与之匹配25个数,那么另个小数必进入队列,且得分会再加一次
sum+=tempsum;
if(tempzs.len){
ans++;
xscountt+=tempsum;//统计队列中能相互加分的小数
}
}
}
}
else{
sum+=sum5[tempzs.ans5][49]+sum2[tempzs.ans5][49]+sumyu[tempzs.ans5];
long long int tempsum=0;
for(int i=1;i<=tempzs.ans2-tempzs.ans5;i++){
if(tempzs.len){
if(tempzs.ans5+i-tempzs.len>0){
tempsum=sum5[tempzs.ans5+i-tempzs.len][49]-sum5[tempzs.ans5+i-tempzs.len-1][49]-sum5[tempzs.ans5+i-tempzs.len][i-1]+sum5[tempzs.ans5+i-tempzs.len-1][i-1];
}
}
else{
tempsum=sum5[tempzs.ans5+i][49]-sum5[tempzs.ans5+i-1][49]-sum5[tempzs.ans5+i][i-1]+sum5[tempzs.ans5+i-1][i-1];
}
if(tempsum){
sum+=tempsum;
if(tempzs.len){
xscountt+=tempsum;
ans++;
}
}
}
}
}
cout<<sum+(zhengshu*(zhengshu-1))/2-xscountt/2;
return 0;
}