2024.3.24题

广州大学第十八届ACM大学生程序设计竞赛(同步赛)

https://ac.nowcoder.com/acm/contest/77448
一. 能赢吗?会赢的!
取整函数:https://blog.csdn.net/aouixh/article/details/53483556

  1. ceil(): double向上取整。
  2. floor():向下取整。
  3. round():(环绕,取其大约)。四舍五入函数。
#include<bits/stdc++.h>
using namespace std;
#define int long long

signed main()
{
	ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
	int n;
	cin>>n;
	vector<int>a(n);//保证a[i]不改变。
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	int sum=0;//护盾值的累加。
	vector<int>b(n);//每个boss刷新后的护盾值加血量。
	vector<int>c(n);//击败每个boss需要的初始战力。
	c[0]=a[0];
	for(int i=0;i<n;i++)
	{
		b[i]=a[i];
		if(i>0)
		{
			b[i]+=ceil(a[i-1]/2.0);
			sum+=floor(a[i-1]/2.0);
			c[i]=b[i]-sum;//新血量-当前增加能力值=初始能力值。
		}
	}
	sort(c.begin(),c.end());
	cout<<c[n-1]+1<<endl;//取最大加一
	return 0;
}

二. 计算几何
因为保证数据不存在相同坐标的点。所以可以根据点的特征来排序:

  1. 如果两个点的纵坐标是当前剩余点最小的。那么两个点和其他的点不会相交。
  2. 如果两个点纵坐标相同,那么横坐标按照从0->∞排序,使每个点都彼此错开。
#include<bits/stdc++.h>
using namespace std;
#define int long long
bool cmp(pair<int,pair<int,int>>a,pair<int,pair<int,int>>b)
{
	if(a.second.second!=b.second.second)
		return a.second.second<b.second.second;
	else
	{
		return a.second.first>b.second.first;
	}
	
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int n;
	cin>>n;
	vector<pair<int,pair<int,int>>>a(n);
	for(int i=0;i<n;i++)
	{
		cin>>a[i].second.first>>a[i].second.second;
		a[i].first=i+1;
	}
	sort(a.begin(),a.end(),cmp);
	if(n%2==0)
	{
		cout<<n/2<<endl;
		for(int i=0;i<n;i+=2)
		{
			cout<<a[i].first<<" "<<a[i+1].first<<endl;
		}
	}else
	{
		cout<<n/2<<endl;
		for(int i=0;i<n;i+=2)
		{
			if(i+1<n)
				cout<<a[i].first<<" "<<a[i+1].first<<endl;
		}
	}
	return 0;
}

三. 矩阵最大路径与

^_^dp动态规划的blog(待完成):https://www.cnblogs.com/miao-jc/p/18092141

//以后会懂的。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;


signed main()
{
	ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
	int n,m;
	cin>>n>>m;
	vector<vector<int>>a(n,vector<int>(m));
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			cin>>a[i][j];
		}
	}
	int k=a[0][0]&a[n-1][m-1];
	vector<vector<int>>st(n,vector<int>(m,0));
	
	vector<int>dx={1,0,-1,0};
	vector<int>dy={0,-1,0,1};
	
	auto check=[&](int x)
	{
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<m;j++)
			{
				st[i][j]=0;
			}
		}
		queue<array<int,2>>q;
		
		q.push({0,0});
		while(q.size())
		{
			auto[xx,yy]=q.front();
			q.pop();
			if(xx==n-1 and yy==m-1)
				return 1;
			if(st[xx][yy])
				continue;
			st[xx][yy]=1;
			for(int i=0;i<4;i++)
			{
				int nx=xx+dx[i],ny=yy+dy[i];
				if(nx<0 or nx>=n or ny<0 or ny>=m or st[nx][ny] or (a[nx][ny]&x)!=x)
					continue;
				q.push({nx,ny});
			}
		}
		return 0;
	};
	int res=0;
	for(int i=30;i>=0;i--)
	{
		if(!(k>>i&1))
			continue;
		int t=res+(1<<i);
		bool flag =check(t);
		if(flag)
			res+=(1<<i);
	}
	cout<<res;
	return 0;

}

牛客周赛 Round 36
https://ac.nowcoder.com/acm/contest/76609
小红走矩阵

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
int minstep(vector<vector<char>>&mm,int n,int m)
{
	vector<vector<int>>step(n,vector<int>(m,-1));
	vector<int>dx={0,0,1,-1};
	vector<int>dy={1,-1,0,0};
	queue<pair<int,int>>q;
	step[0][0]=0;
	q.push({0,0});
	while(!q.empty())
	{
		pair<int,int>cur=q.front();
		q.pop();
		for(int i=0;i<4;i++)
		{
			int x=cur.first+dx[i];
			int y=cur.second+dy[i];
			if(x>=0&&x<n&&y<m&&mm[x][y]!=mm[cur.first][cur.second]&&step[x][y]==-1)
			{
				step[x][y]=step[cur.first][cur.second]+1;
				//走到下一个格子的步数等于上一个格子数加一。
				q.push({x,y});
				//把可以走到的格子装到队列里
			}
		}
	}
	return step[n-1][m-1];
}

signed main()
{
	ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
	int n,m;
	cin>>n>>m;
	vector<vector<char>>mm(n,vector<char>(m));
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			cin>>mm[i][j];
		}
	}
	int r=minstep(mm,n,m);
	if(r==-1)
	{
		cout<<"-1"<<endl;
		//初始化为-1,如果是-1的话就没有走到。
	}else 
	{
		cout<<r<<endl;
	}
	return 0;
}

天梯赛训练

https://vjudge.net/contest/617184#problem/H
P1098 [NOIP2007 提高组] 字符串的展开
https://www.luogu.com.cn/problem/P1098
1、s.erase(x,y) :表示将字符串s从x位置起删除y个字符

2、s.insert(x,y) :表示将字符串y(或字符y)插入到s的x位置处

3、s.push_back(x) :表示在s的末尾插入字符x

4、reverse(s.begin(),s.end()) :将字符串s翻转

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
	int a,b,c;
	cin>>a>>b>>c;
	string s,t;
	cin>>s;
	for(int i=0;i<s.size();i++)
	{
		if(s[i]!='-')cout<<s[i];
		else
		{
			auto l=s[i-1],r=s[i+1];
			if('0'<=l and l<='9' and '0'<=r and r<='9')
			{
				if(l>=r)
				{
					cout<<'-';
					continue;
				}
				t="";
				for(l++;l<r;l++)
				{
					for(int j=0;j<b;j++)
					{
						if(a<=2)
							t+=l;
						else 
							t+='*';
					}
				}if(c==2)
				{
					reverse(t.begin(),t.end());
				}
				cout<<t;
			}else if('a'<=l and l<='z' and 'a'<=r and r<='z')
			{
				if(l>=r)
				{
					cout<<'-';
					continue;
				}
				t="";
				for(l++;l<r;l++)
				{
					for(int j=0;j<b;j++)
					{
						if(a==1)
							t+=l;
						else if(a==2)
						{
							t+=l+'A'-'a';
						}else
						{
							t+='*';
						}
					}
				}
				if(c==2)
					reverse(t.begin(),t.end());
				cout<<t;
			}else{
				cout<<"-";
			}
		}
	}
	return 0;
}

P2058 [NOIP2016 普及组] 海港

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,t,m,x;
int nation[1000005];
int sum;
struct node
{
	int s,t;//只要开个结构体存人头数
};
queue<node>ship;
node h;
signed main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>t>>m;
		while(!ship.empty())//只要还有人就对队列进行检查
		{
			h=ship.front();//循环取队头(由于时间是单调递增的)
			if(h.t+86400<=t)//如果在时间外(不符合条件),则对答案和队列进行更新(删减)
			{
				nation[h.s]--;//这个国籍人数总数减1(因为这不是24小时内的人)
				if(nation[h.s]==0)
				{
					sum--;//如果这个国籍没有人了,则答案数减1(之前记过)
				}
				ship.pop();
				continue;//因为是单调递增的,所以有可能还会有,继续去找
			}
			break;//如果现在这个在24小时内,后面的肯定也符合条件,直接退出
		}
		for(int j=1;j<=m;j++)
		{
			cin>>x;
			h.s=x,h.t=t;
			ship.push(h);
			nation[x]++;//这个国籍的人加1
			if(nation[x]==1)
				sum++;//如果这个国籍是1,相对第一次出现,那么就算上他
		}
		cout<<sum<<endl;
	}
	return 0;
}

四川农业大学新生选拔赛

【模板】01背包
https://blog.csdn.net/kingxzq/article/details/136465242
你有一个背包,最多能容纳的体积是V。
现在有n个物品,第i个物品的体积为vi,价值为wi。

(1)求这个背包至多能装多大价值的物品?
(2)若背包恰好装满,求至多能装多大价值的物品?

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define INF -999999
const int N=1e5+10;
int dp[1005],v[1005],w[1005];


signed main()
{
	ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
	int n,V;
	cin>>n>>V;//物品个数,背包体积。

	for(int i=1;i<=n;i++)
	{
		cin>>v[i]>>w[i];//体积,价值
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=V;j>=v[i];j--)
		{
			dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
		}
	}
	cout<<dp[V]<<endl;
	memset(dp,-0x3f,sizeof(dp));
	dp[0]=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=V;j>=v[i];j--)
		{
			dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
		}
	}
	if(dp[V]<0)
		dp[V]=0;
	cout<<dp[V]<<endl;
	return 0;
}

取石子游戏 1

关键就是何时石子数目达到 x(k+1),其中x为任意整数,从这一刻起,无论这一刻以后首个拿石子的人(注意:“这一刻以后”为定语,这个人不一定是整个游戏首个拿石子的人)拿几个石子,另一位聪明的玩家一定会保证二者所拿石子数之和为k+1来保证他自己赢。
故对于整个游戏的先手来说,他一定要在游戏开始石子数为 x(k+1)+s,s<k 时拿走s个石子来取胜,而如果开始时石子数便为x(k+1),只要对手足够聪明他就必输。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;

signed main()
{
	ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
	int n,k;
	cin>>n>>k;
	if(n%(k+1)!=0)
	{
		cout<<"1"<<endl;
	}else
	{
		cout<<"2"<<endl;
	}
	return 0;
}

2024牛客寒假算法基础集训营4
B、左右互博

每次操作都可以将一个数量>1的石堆分成两个,直到全1的时候无法进行操作,
所以只要数组中所有的元素和-数组大小模2==0就是sweet获胜,反之gui获胜

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
signed main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int n;
	cin >> n;
	int x,sum=0;
	for(ll i = 1; i <= n; ++i){
		cin >> x;
		sum += x;
	}
	if((sum - n) % 2){
		cout << "gui" << endl;
	} 
	else{
		cout << "sweet" << endl;
	}
	return 0;
}
#include<bits/stdc++.h>
using namespace std;

int main(){
    int n,k,sum=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&k);
        sum+=(k-1);
    }
    if(sum%2==0) printf("sweet");
    else printf("gui");
    return 0;
}

P4391 [BOI2009] Radio Transmission 无线传输
https://www.luogu.com.cn/problem/P4391

KMP算法????????????
你们好强。
等我有时间再补补写写吧。
https://www.cnblogs.com/miao-jc/p/18076747

posted @ 2024-03-24 18:19  miao-jc  阅读(7)  评论(0编辑  收藏  举报