NYIST_ACM工作室寒假周赛2题解

这场就是让你们回顾回顾放松放松的 学姐一片苦心🙂

赛前写的题解 觉得这场给你们的体验太好了吧也🙂
赛后看了你们的榜 好家伙 就这啊?
两个BFS板子题做出来的有几个?
虽然A题HDU题面锅了但专题原题都wa穿?
就这专题还不刷?

cxs:一群fw(撤回的太快huahua没截到证据)

A.Catch That Cow

板子题 题面锅了 多组 https://blog.csdn.net/LYHVOYAGE/article/details/18229133


B.Numbers on Whiteboard

题意大概为,给你一个1~n的序列,你每次需要选择两个数a , b删除,再将(a+b+1)/2[题中为实除]这个数放回序列中。最后使得这个序列变成一个数,且这个数要尽可能小。输出这个最小数,以及你依次进行的操作选择数。而这个最小数通过多组数据推得必能为2。操作的话就从后两个开始取,取完之后把新的数再与前一个去取。
代码实现:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define hhh 1000005
ll t,n,m,k,sum,ans,maxx,flag;
double summ;
ll /*a[hhh],*/b[hhh],c[hhh],mp[hhh],book[hhh];
int main() {
	cin>>t;
	while(t--){
		cin>>n;
		for(ll i=1;i<=n;i++){
			b[i]=i;
		}
		cout<<"2"<<endl;
		for(ll i=n-1;i>=1;i--){
			cout<<b[i+1]<<" "<<b[i]<<endl;
			b[i]=(b[i]+b[i+1]+1)/2;
		}
	}
	return 0; 
} 

C.Dominant Piranha

题意大概是按顺序给你一组🐟的大小,大🐟可以吃掉其左或右的小🐟,吃掉后自身变大1。问你是否有🐟经过不断的左右吞吃可以把其他所有🐟吃掉(其他🐟不动),如果有输出任意一个。思路能就是让强的更强,若所有🐟一样大,那么就输出-1因为无法吞吃,否则找出最大的🐟,要求其左或右存在必它小的🐟输出即可。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define hhh 1000005
ll t,n,m,k,ans;
ll a[hhh],b[hhh],c[hhh],mp[hhh],book[hhh];
int main() {
	cin>>t;
	while(t--) {
		cin>>n;
		ll maxx=-1,sum=0,flag=0;
		for(ll i=1; i<=n; i++)
			cin>>a[i];
		for(ll i=1; i<=n; i++) {
			if(a[i]==a[1]) sum++;
			if(a[i]>maxx) {
				if(i==1) {
					if(a[i]>a[i+1]) {
						flag=i;
						maxx=a[i];
					}
				} else if(i==n) {
					if(a[i]>a[i-1]) {
						flag=i;
						maxx=a[i];
					}
				} else {
					if(a[i]>a[i-1]||a[i]>a[i+1]) {
						flag=i;
						maxx=a[i];
					}
				}
			}
		}
	    if(sum==n) cout<<"-1"<<endl;
	    else cout<<flag<<endl;
    }
return 0;
}

D.Knight Moves

BFS板子题 这篇https://blog.csdn.net/libin56842/article/details/9016577


E.二分查找(五)

一道标准的二分查找模板题。
中文题面,题意应该很好理解,给你一个数,在给定数组中找到小于等于该数的最大值。样例中给你数组:1 1 1 2 3 5 5 7 8 9,第一次查询0,可得不存在≤0的最大值,所以输出-1;同理,第二次查询1,输出1;第三次查询4,输出3……
做法就是首先将数组从小到大进行排序。若要查询的数小于数组中的任意一数,则输出-1;大于数组中的任意一数则输出数组中最大的数。若要查询的数是数组中的元素,则直接输出该数;若不是,则输出该数右界下标减一所对应的数组内的数。
代码实现:

#include <bits/stdc++.h>
using namespace std;
#define hhh 100010
int a[hhh];
int h(int l,int r,int m){
	while(l<=r){
		int mid=l+(r-l)/2;
		if (a[mid]==m) return 1;
		else if(a[mid]<m) l=mid+1;
		else r=mid-1;
	}
	return 0;
}
int hh(int l,int r,int m){
	while(l<=r){
		int mid=l+(r-l)/2;
		if(a[mid]<=m) l=mid+1;
		else r=mid-1;
	}
	return l;
}
int main() {
	int n,m,x;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	sort(a+1,a+n+1);
	for(int i=1;i<=m;i++){
		cin>>x;
		if(x<a[1]) cout<<"-1"<<endl;
		else if(x>a[n]) cout<<a[n]<<endl;
		else{
			if(h(1,n,x)) cout<<x<<endl;
			else cout<<a[hh(1,n,x)-1]<<endl;
		}
	}
	return 0;
}

F. Paradise City

给出一个3×3n的矩阵,表示n个3×3的旅馆,每个*表示一个四人间,问能居住人数最多的旅馆最多可以住多少人,大水题。
这个写法复杂了,简单写法看这:https://blog.csdn.net/V5ZSQ/article/details/65444506

#include <bits/stdc++.h>
using namespace std;
#define hhh 1005
int t,n;
char a[hhh][hhh];
int mov[8][2]= {-1,-1,-1,0,-1,1,0,-1,0,1,1,-1,1,0,1,1};
int main() {
	scanf("%d",&t);
	while(t--) {
		scanf("%d",&n);
		for(int i=0; i<3; i++) 
			scanf("%s",a[i]);
		int maxx=0,sum=0;
		for(int i=0; i<3; i++) {
			for(int j=0; j<3*n; j++) {
				if(a[i][j]=='X') {
					int ans=0;
					for(int s=0; s<8; ++s) {
						int x=i+mov[s][0];
						int y=j+mov[s][1];
						if(x<0||y<0||x>2||y>3*n-1||a[x][y]!='*') 
							continue;
						ans++;
					}
					sum=ans*4;
					if(sum>maxx) 
						maxx=sum;
				}
			}
		}
		printf("%d\n",maxx);
	}
	return 0;
}

G.PIN Codes

题意大概是给你2-10个4位数的纯数字密码,如果里面有相同的两个,就选择其中一个的一位数字改变它,使所有的密码不相同,输出最少改变的次数以及改变后的密码。暴力循环判断是否重复就可以。注意改密码的时候不能把密码改成别的密码,所以选定个位置,用一个标记数组判断数字0-9是否在这个位置上出现过。

#include<bits/stdc++.h>
using namespace std;
char h[50][50];
int flag[50];
int t,n,ans,k;
int main(){
	cin>>t;
	while(t--){
		cin>>n;
		for(int i=1;i<=n;i++)	
			cin>>h[i];
		ans=0;
		for(int i=1;i<=n;i++)
			for(int j=i+1;j<=n;j++)
				if(!strcmp(h[i],h[j])){
					ans++;
					memset(flag,0,sizeof(flag));
					for(int l=1;l<=n;l++)
						flag[h[l][3]-'0']=1;
					for(int l=0;l<=9;l++)
						if(flag[l]==0){
							h[j][3]=l+'0';
							break;
						}		
				}
		cout<<ans<<endl;
		for(int i=1;i<=n;i++)
			cout<<h[i]<<endl;
	}
	return 0;
}

真真是没见过比这场简单的了 hzwz🙂


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值