强化阶段 Day 2 算法笔记 3.1简单模拟(2)

目录

1.划拳

2.数组元素循环右移问题

3.数字分类

4.锤子剪刀布

5.Shuffling Machine

6.Shortest Distance

7.A+B and C (64bit)

8.一元多项式求导



#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

int main(){
	
	int n;
	scanf("%d",&n);
	
	int a,x,b,y;
	int d1=0,d2=0;
	while(n--){
		scanf("%d%d%d%d",&a,&x,&b,&y);
		if(x==a+b&&y!=a+b){
			d2++;
		}else if(y==a+b&&x!=a+b){
			d1++;
		}
	}
	
	printf("%d %d",d1,d2);
	return 0;
}

2.数组元素循环右移问题

1.记得取余,因为每移动6次就会恢复原来的顺序

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

int main(){
	
	int n;
	int m;
	scanf("%d%d",&n,&m);
	int martix[110];
	for(int i=0;i<n;i++){
		scanf("%d",&martix[i]);
	}
	
	int step=m%n;
	int count=0;
	
	for(int i=n-step;i<n;i++){
		printf("%d",martix[i]);
		count++;
		if(count<n) printf(" ");
	}
	
	for(int i=0;i<n-step;i++){
		printf("%d",martix[i]);
		count++;
		if(count<n) printf(" ");
	}
	
	return 0;
}

3.数字分类

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

int main(){
	
	int n,martix[1003];
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&martix[i]);
	}
	
	int x1=0,x2=0,count=0,x3=0,count2=0,x5=0;
	bool flag1=false,flag2=false,flag3=false,flag4=false,flag5=false;
	double x4;
	for(int i=0;i<n;i++){
		if(martix[i]%10==0){
			flag1=true;
			x1+=martix[i];
		}
		if(martix[i]%5==1){
			flag2=true;
			if(count%2==0) x2+=martix[i];
			else x2-=martix[i];
			count++;
		}
		if(martix[i]%5==2){
			flag3=true;
			x3++;
		}
		if(martix[i]%5==3){
			flag4=true;
			x4+=martix[i];
			count2++;
		}
		if(martix[i]%5==4){
			flag5=true;
			if(martix[i]>x5){
				x5 = martix[i];
			}
		}
	}
	double y4 = x4/count2;
	
	if(flag1==true){
		printf("%d ",x1);
	}else{
		printf("N ");
	}
	
	if(flag2==true){
		printf("%d ",x2);
	}else{
		printf("N ");
	}
	
	if(flag3==true){
		printf("%d ",x3);
	}else{
		printf("N ");
	}
	
	if(flag4==true){
		printf("%.1lf ",y4);
	}else{
		printf("N ");
	}
	
	if(flag5==true){
		printf("%d",x5);
	}else{
		printf("N");
	}
	
	return 0;
}

4.锤子剪刀布

字母的字典序即字母表的顺序

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

int outcome(char a,char b){
	if(a==b){
		return 0;
	}
	else if((a=='C'&&b=='J')||(a=='J'&&b=='B')||(a=='B'&&b=='C')){
		return 1;
	}else{
		return -1;
	}
}

int get_num(char x){
	if(x=='B') return 1;
	else if(x=='C') return 2;
	else return 3;
}

char str[6] = {'B','C','J'};
void print(int a[]){
	int max_=-1,index=-1;
	for(int i=1;i<=3;i++){
		if(a[i]>max_){
			index = i;
			max_ = a[i];
		}
	}
	printf("%c",str[index-1]);
}

int main(){
	
	int n;
	scanf("%d",&n);
	getchar();
	char a,b;
	
	int w1=0,w2=0,e=0;
	int index;
	int num1[10002]={0},num2[10002]={0};
	for(int i=0;i<n;i++){
		scanf("%c %c",&a,&b);
		getchar();
		if(outcome(a,b)==0) e+=1;
		else if(outcome(a,b)<0){
			w2++;
			index = get_num(b);
			num2[index]++;
		}
		else{
			w1++;
			index = get_num(a);
			num1[index]++;
		}
	}
	
	printf("%d %d %d\n",w1,e,w2);
	printf("%d %d %d\n",w2,e,w1);
	print(num1);
	printf(" ");
	print(num2);
	
	
	return 0;
}

5.Shuffling Machine

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

int card[100];
int nexts[100]={0};


int martix[100],indexs,temp;
void permutation(){
	for(int i=1;i<=54;i++){
		indexs = martix[i];
		nexts[indexs] = card[i];
	}
	for(int i=1;i<=54;i++){
		card[i] = nexts[i];
	}
}

int main(){
	
	for(int i=1;i<=54;i++){
		card[i] = i;
	}
	
	int n;
	scanf("%d",&n);
	
	for(int i=1;i<=54;i++){
		scanf("%d",&martix[i]);
	}
	
	for(int i=0;i<n;i++){
		permutation();
	}
	
	char c[7] = {'S','H','C','D','J'};
	for(int i=1;i<=54;i++){
		if(card[i]%13==0) printf("%c%d",c[card[i]/13-1],13);
		else printf("%c%d",c[card[i]/13],card[i]%13);
		if(i!=54){
			printf(" ");
		}
		
	}
	
	return 0;
}

6.Shortest Distance

这种写法最后一个样例会超时,但20分也可以拿17分

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

int main(){
	
	int n;
	scanf("%d",&n);
	int martix[100004];
	for(int i=1;i<=n;i++){
		scanf("%d",&martix[i]);
	}
	int m;
	scanf("%d",&m);
	int start,end;
	
	while(m--){
		scanf("%d %d",&start,&end);
		int d1=0,d2=0;
		
		if(start==end){
			printf("0\n");
			continue;
		}else if(start>end){
			int temp=end;
			end = start;
			start = temp;
		}
		
		for(int i=start;i<end;i++){
			d1+=martix[i];
		}
		for(int i=end;i<=n;i++){
			d2+=martix[i];
		}
		for(int i=1;i<start;i++){
			d2+=martix[i];
		}
		
		if(d1>d2){
			printf("%d\n",d2);
		}else{
			printf("%d\n",d1);
		}
	}
	
	return 0;
}

这种方法就没有超时,需要在输入时就计算好每一站离终点的距离

有点动态规划的思想在里面

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

int main(){
	
	int n;
	scanf("%d",&n);
	int martix[100004]={0};
	int value;
	for(int i=1;i<=n;i++){
		scanf("%d",&value);
		martix[i] = martix[i-1] +value;
	}
	
	int m;
	scanf("%d",&m);
	int start,end;
	while(m--){
		scanf("%d %d",&start,&end);
		if(start==end){
			printf("0\n");
			continue;
		}else if(start>end){
			int temp=end;
			end = start;
			start = temp;
		}
		
		int d1 = martix[end-1] - martix[start-1];
		int d2 = martix[n-1] - martix[end-1] + martix[n] - martix[n-1] + martix[start-1] - martix[0];
		
		if(d1<d2) printf("%d\n",d1);
		else printf("%d\n",d2);
		
	}
	
	return 0;
}

7.A+B and C (64bit)

这一题涉及到了数字在底层的操作,比如两个整数如果过大,相加之后溢出会变成负数,反之亦然

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

int main(){
	
	int n;
	scanf("%d",&n);
	long long a,b,c;
	long long apb;
	for(int i=1;i<=n;i++){
		scanf("%lld%lld%lld",&a,&b,&c);
		apb=a+b;
		if(a>0&&b>0&&apb<0) printf("Case #%d: true\n",i);
		else if(a<0&&b<0&&apb>=0) printf("Case #%d: false\n",i);
		else{
			if(apb>c){
				printf("Case #%d: true\n",i);
			}else{
				printf("Case #%d: false\n",i);
			}
		}
	}
	
	return 0;
}

8.一元多项式求导

首先,这种题目的输入需要用到EOF

其次,得考虑求导之后全是零的情况,否则会有两个样例无法通过

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

struct node{
	int x=0,y=0;
}martix[100];

int main(){
	
	int x,y,num=1;
	while(scanf("%d%d",&x,&y)!=EOF){
		martix[num].x=x;
		martix[num++].y=y;
	}
	int count=0;
	for(int i=1;i<num;i++){
		martix[i-1].x = martix[i].x*martix[i].y;
		martix[i-1].y = martix[i].y-1;
		if(martix[i-1].x!=0){
			count++;
		}
	}
	
	if(count==0){
		printf("0 0");
	}else{
	for(int i=0;i<num-1;i++){
		if(martix[i].x!=0){
			printf("%d %d",martix[i].x,martix[i].y);
			count--;
			if(count!=0) printf(" ");
		}
	}
}

	return 0;
}

猜你喜欢

转载自blog.csdn.net/aixiaoxiao13/article/details/121696528