首页 > 其他分享 >【LGR-148-Div.3】洛谷基础赛 #1 & MGOI Round I

【LGR-148-Div.3】洛谷基础赛 #1 & MGOI Round I

时间:2023-08-07 09:44:07浏览次数:31  
标签:MGOI 洛谷 int 148 num long ans dis define

【LGR-148-Div.3】洛谷基础赛 #1 & MGOI Round I

T1 luoguP9502 『MGOI』Simple Round I | A. 魔法数字 \(100pts\)

  • 水题,场切了。

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long 
    #define sort stable_sort 
    #define endl '\n'
    int main()
    {
    	int n,m;
    	cin>>n;
    	m=log2(n);
    	if((1<<m)==n)
    	{
    		if(m%2==1)
    		{
    			m--;
    		}
    		else
    		{
    			m-=2;
    		}
    	}
    	else
    	{
    		if(m%2==1)
    		{
    			m--;
    		}
    	}	
    	cout<<m;
    	return 0;
    }
    

T2 luoguP9503 『MGOI』Simple Round I | B. 魔法照相馆 \(100pts\)

  • 水题,赛场上不会位运算,就当成大模拟打了,码风凑合看吧,谨慎观看此代码。

  • 可以将 \(if,else\) 压成位运算。

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define sort stable_sort
    #define endl '\n'
    int main()
    {
    	ll n,i,ans=0,r=1,b=1,w=1;
    	char pd,en='W';
    	cin>>n;
    	for(i=1;i<=n;i++)
    	{
    		cin>>pd;
    		if(pd!=en)
    		{
    			if(en=='W')
    			{
    				if(pd=='B')
    				{
    					if(b==1)
    					{
    						ans++;
    					}
    					else
    					{
    						ans+=2;
    						b=1;
    					}
    					w=0;
    				}
    				if(pd=='R')
    				{
    					if(r==1)
    					{
    						if(b==1)
    						{
    							ans+=2;
    							b=0;
    						}
    						else
    						{
    							ans++;
    						}
    					}
    					else
    					{
    						if(b==1)
    						{
    							ans+=3;
    							b=0;
    						}
    						else
    						{
    							ans+=2;
    						}
    					}
    					w=0;	
    					r=1;
    				}
    			}
    			if(en=='B')
    			{
    				if(pd=='R')
    				{
    					if(r==1)
    					{
    						ans++;
    					}
    					else
    					{	
    						ans+=2;
    						r=1;
    					}
    					b=0;
    					r=1;
    				}
    				if(pd=='W')
    				{
    					ans+=1;	
    					w=1;
    				}
    			}
    			if(en=='R')
    			{
    				if(pd=='W')
    				{
    					ans+=1;
    					w=1;
    				}
    				if(pd=='B')
    				{
    					ans+=1;
    					b=1;
    				}
    			}
    			en=pd;
    		}
    	}
    	cout<<ans;
    	return 0;
    }
    

T3 luoguP9504 『MGOI』Simple Round I | C. 魔法禁林 \(0pts\)

  • 注意 \(0\le w\le 100\) 这个条件,又因为 扣血方式为\(\left\lfloor \frac{w_i}{k} \right\rfloor\) ,所以易知最多跑 \(100\) 条边(因为 \(k>w_i\) 就不扣血了,能够无伤走到终点,直接返回记录答案即可),故魔力值 \(\le 100\) 。
  • 正解:以 \(t\) 为起点, \(s\) 为终点,便于确定 \(k\) 的值,跑单源最短路。
    • 考虑给 \(dijkstra\) 中的 \(dis\) 数组增加一维,令 \(dis[i][j]\) 表示当 \(k=i\) 时,走到 \(j\) 的最小生命值。
      • 优先队列优化了个空气,换成 \(queue\) 了,因为第一关键字是保证单调递增的,第二关键字排序无意义。
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define sort stable_sort
    #define endl '\n'
    struct node
    {
    	int nxt,to,w;
    }e[90000];
    int head[90000],vis[110][90000],dis[110][90000],cnt=0,ans=0x7f7f7f7f;
    void add(int u,int v,int w)
    {
    	cnt++;
    	e[cnt].nxt=head[u];
    	e[cnt].to=v;
    	e[cnt].w=w;
    	head[u]=cnt;
    }
    void dijkstra(int s)
    {
    	int x,num,i;
    	queue<pair<int,int> >q;
    	memset(vis,0,sizeof(vis));
    	memset(dis,0x3f,sizeof(dis));
    	dis[1][s]=0;
    	q.push(make_pair(1,s));
    	while(q.empty()==0)
    	{
    		num=q.front().first;
    		x=q.front().second;
    		q.pop();
    		if(num>100)//当走的边数大于100时,直接返回
    		{
    			ans=min(ans,dis[num][x]);
    		}
    		else
    		{	
    			if(vis[num][x]==0)
    			{
    				vis[num][x]=1;
    				for(i=head[x];i!=0;i=e[i].nxt)
    				{
    					if(dis[num+1][e[i].to]>dis[num][x]+e[i].w/num)
    					{
    						dis[num+1][e[i].to]=dis[num][x]+e[i].w/num;
    						q.push(make_pair(num+1,e[i].to));
    					}
    				}
    			}
    			
    		}
    	}
    }
    int main()
    {
    	int n,m,s,t,u,v,w,i;
    	cin>>n>>m>>s>>t;
    	for(i=1;i<=m;i++)
    	{
    		cin>>u>>v>>w;
    		add(u,v,w);
    		add(v,u,w);
    	}
    	dijkstra(t);
    	for(i=1;i<=101;i++)
    	{
    		ans=min(ans,dis[i][s]);
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

T4 luoguP9505 『MGOI』Simple Round I | D. 魔法环 \(0pts\)

  • 因为涉及变量重复问题,题面中的 \(k\) 此处用 \(m\) 代替。
  • 考虑破坏为链,进行 \(DP\) ,枚举以每个点为起点,令 \(f[i][j]\) 表示前 \(i\) 个中激活了 \(j\) 个精灵产生的附魔值的最小值,枚举上一个被激活的精灵 \(k(1\le k <i)\) 进行状态转移,
    • 得到在 \(1\le j \le i\le n,j<m\) 时, \(f[i][j]=min(f[i][j],f[k][j-1]+max(b[k],b[i])×\sum\limits_{h=1}^{i-k-1}h+b[i]^2)\)。
    • 得到在 \(m\le i\le n,j=m\) 时, 因为要满足 至少 激活 \(m\) 个精灵,\(f[i][j]=min(f[i][j],f[k][m]+max(b[k],b[i])×\sum\limits_{h=1}^{i-k-1}h+b[i]^2)\)。
    • 这样的复杂度为 $O(n^3k) $,成功 \(TLE\) 。
  • 有个贪心的结论,激活魔供值为 \(0\) 的精灵一定不劣(因为是否激活 \(0\) 对答案没有影响)。故直接考虑以 \(0\) 为起点,故 \(f[1][1]=0^2=0\) ,接着进行状态转移。时间复杂度 \(O(n^2k)\) ,卡着时限过。
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define sort stable_sort
    #define endl '\n'
    ll a[3001],b[3001],f[3001][101];//十年OI一场空,不开long long见祖宗
    int main()
    {
    	ll n,m,i,j,k,rt,ans=0x7f7f7f7f;
    	cin>>n>>m;
    	memset(f,0x3f,sizeof(f));//初始化
    	f[1][1]=0;
    	for(i=1;i<=n;i++)
    	{
    		cin>>a[i];
    		if(a[i]==0)
    		{
    			rt=i;
    		}
    	}
    	for(i=1;i<=n;i++)//以0为起点,重新构造
    	{
    		b[i]=a[(i+rt-2)%n+1];
    	}
    	for(i=1;i<=n;i++)
    	{
    		for(j=2;j<=min(i,m);j++)
    		{
    			for(k=1;k<=i-1;k++)
    			{
    				f[i][j]=min(f[i][j],f[k][j-1]+(i-k-1)*(i-k)/2*max(b[k],b[i])+b[i]*b[i]);
    				if(j==m)
    				{
    					f[i][j]=min(f[i][j],f[k][j]+(i-k-1)*(i-k)/2*max(b[k],b[i])+b[i]*b[i]);
    				}
    			}
    		}
    	}
    	for(i=m;i<=n;i++)
    	{
    		ans=min(ans,f[i][m]+(n-i)*(n-i+1)/2*b[i]);
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

总结

看清楚题再交,不要像我一样好几次把 \(T3\) 代码交到了 \(T4\) 。

标签:MGOI,洛谷,int,148,num,long,ans,dis,define
From: https://www.cnblogs.com/The-Shadow-Dragon/p/17609758.html

相关文章

  • 『MGOI』Simple Round I | B. 魔法照相馆 题解
    题目传送门一道模拟题。并不复杂的模拟题,也不需要用到贪心。我们可以创建一个数组来记录每个幕布是否被拉上,统计答案的时候,就看看这块幕布前面有多少个没拉上的,最后如果这块幕布拉上了,就重新放下来就行了。#include<bits/stdc++.h>#definelllonglong#defineINF1e9usi......
  • 【题解】Luogu[P9504] 『MGOI』Simple Round I C. 魔法禁林
    Link这题我们发现如果直接去枚举生命和法力值显然是不行的,又看到说最小的生命值,不禁想到最短路,但是怎么跑?我们令经过一条边之前魔力值为\(k\),那么该边的边权为\(\lfloor\dfrac{w}{k}\rfloor\),于是我们讲题目转化为了边权为\(\lfloor\dfrac{w}{k}\rfloor\)时\(s\)到\(t\)......
  • 【LGR-148-Div.3】洛谷基础赛 #1 & MGOI Round I
    【LGR-148-Div.3】洛谷基础赛#1&MGOIRoundI据说是普及组难度?T1P9502『MGOI』SimpleRoundI|A.魔法数字\(100pts\)题目描述初级魔法士小M的魔法数字是\(2\)。给定一个正整数\(n\),小M需要找到最大的偶数\(m\),使得\(2^m<n\)。又双叒叕是个水题,然后被又双......
  • 【LGR-148-Div.3】洛谷基础赛 #1 & MGOI Round I
    T1简单题,题面十分清晰,就是给我们\(n\),要求使\(2^m<n\)成立的最小偶数\(m\)。(要注意\(log_2N=m,m|2\)的情况)#include<bits/stdc++.h>#definelllonglong#definereregisterusingnamespacestd;constintN=800,INF=0x3f3f3f3f;lln;intmain(){ cin>>n; llk=log......
  • 【反思】洛谷8月月赛 Div.2 & RiOI Round 2 赛后反思
    RiOIR2赛后反思赛时开了一个T1,但是\(0pts\),然后就跑去跟人对线然后复盘(主要是我的锅,我忘记对线怎么开始的了)到了吃饭(雾不过本来我也不会做,不能怪人家赛后是shenshen教我T1+看的若归老师的反思捏推歌:歌爱ユキ&稲葉曇《キミに回帰缐》(希望没打错是我的错吗铅笔......
  • 2023年多校联训NOIP层测试4+洛谷 8 月月赛 I & RiOI Round 2
    2023年多校联训NOIP层测试4爆零了T1幸运数字\(0pts\)T2密码\(0pts\)没做到,咕了。T3小X和他的朋友们\(0pts\)没做到,咕了。T4树上询问\(0pts\)没做到,咕了。【LGR-150-Div.2】洛谷8月月赛I&RiOIRound2T1luoguP9496「RiOI-2」hacker\(100pts\)......
  • 【LGR-150-Div.2】洛谷 8 月月赛 I & RiOI Round 2
    比赛实况赛前看了眼难度分布,红橙黄绿,感觉随便杀(爆我)顺序开题,先看A题,没仔细读,一眼以为单次操作只能翻转一位,写了个十进制转二进制找不同,结果WA了。再看了一眼题,发现题干定义的操作可以一次操作很多位,然后一个操作是把0变1,另一个是把1变0。所以只需要看两个数二进制对......
  • 【LGR-150-Div.2】洛谷 8 月月赛 I & RiOI Round 2
    T1一直没有详细看过位运算的我瑟瑟发抖。出题人给了帮助(有用但是不多)。直接讲考试想法:首先,手玩样例后,果断猜测:将两个数转化为二进制之后,把头对齐,然后找出不同位,再加上二者位数之差。结果:\(0Pts\)之后,又想了很久,发现了按位与等价于将原来二进制数中的1变为0,按位或等价于将原来......
  • LGR-147-Div.3】洛谷网校 7 月普及组月赛 & yLOI2022 总结
    Upd:2023/8/5补T1普及组的题,而且T1,而且叫签到题。所以非常简单,入门难度。没什么好说的。就是统计大写,小写和字母个数。#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintN=100+5;strings;intmain(){ cin>>s; intx=0,y=0,z=0; for(inti=......
  • 洛谷 P1553 数字反转(升级版)
    题目描述给定一个数,请将该数各个位上数字反转得到一个新数。整数反转是将所有数位对调。小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。百分数的分子一定是整数,百分数只改变数字......