2019山东ACM省赛补题题解

   日期:2020-10-05     浏览:102    评论:0    
核心提示:C- Wandering Robot题意:大体意思就是一个机器人按照指定的路线走来走去,最后求最远点和初始点(0,0)的距离思路:1.确定最远点第一次循环路径确定之后,其他的循环基本都是在平移,最远点可能是在最后一次循环但是也很有可能在第一次循环2.确定最远点的位置K的值特别的大,所以肯定不能用for循环来确定最后的位置通过第一次循环和以后路径的平移来确定最后的位置第一次的末位置是第二次循环的初位置,通过第一次的平移规律*(k-1)推出最后一次循环的初位置,根据位置移动方案推出最后一次循环

Wandering Robot
题意:
大体意思就是一个机器人按照指定的路线走来走去,最后求最远点和初始点(0,0)的距离
思路:
1.确定最远点
第一次循环路径确定之后,其他的循环基本都是在平移,最远点可能是在最后一次循环但是也很有可能在第一次循环
2.确定最远点的位置
K的值特别的大,所以肯定不能用for循环来确定最后的位置
通过第一次循环和以后路径的平移来确定最后的位置
第一次的末位置是第二次循环的初位置,通过第一次的平移规律*(k-1)推出最后一次循环的初位置,根据位置移动方案推出最后一次循环所有的位置并比较他们跟初始点的距离,计算距离最远的点
3.比较第一次和最后一次
最后一次循环的点的距离值与最后一次循环的点的距离值相比较,求max最大值

#include<bits/stdc++.h>
#include<math.h>
using namespace std;
#define ll long long
int main()
{ 
    ll t;
    cin>>t;
    while(t--)
    { 

        ll n,k;
        cin>>n>>k;
        string s;
        cin>>s;
        ll x=0,y=0;
        ll xn=0;
        for(ll i=0; i<n; i++)
        { 
            if(s[i]=='U')
                y++;
            if(s[i]=='D')
                y--;
            if(s[i]=='L')
                x--;
            if(s[i]=='R')
                x++;

            if(xn<fabs(x)+fabs(y))
            { 
                xn=fabs(x)+fabs(y);
            }
        }

        ll sumx=(k-1)*x;
        ll sumy=(k-1)*y;
        ll maxx=0;
        for(ll i=0; i<n; i++)
        { 
            if(s[i]=='U')
                sumy++;
            if(s[i]=='D')
                sumy--;
            if(s[i]=='L')
                sumx--;
            if(s[i]=='R')
                sumx++;
            if(maxx<fabs(sumx)+fabs(sumy))
            { 
                maxx=fabs(sumx)+fabs(sumy);
            }
        }
        cout<<max(xn,maxx)<<endl;
    }
}

Stones in the Bucket
题意:
n桶石头,选择从桶中删除一个石头或者把其中一个石头从一个桶移动到另一个桶,这两种操作各是一次操作,求最少操作几次,使每堆石头的数量一样。
思路:
求数量多于平均值的桶多出的那部分值的总和,因为这部分值早晚都是要被丢掉或者是移到别的桶。

#include<bits/stdc++.h>
#define ll long long
using namespace std;

int num[100005];
int main()
{ 
    ll t,n;
    cin>>t;
    while(t--)
    { 
        cin>>n;
        ll num1=0,ans=0;
        for(int i=1;i<=n;i++)
        { 
            cin>>num[i];
            num1=num1+num[i];
        }
        ll m=num1/n;
        for(int i=1;i<=n;i++)
        { 
            if(num[i]>m)
            { 
                ans=ans+(num[i]-m);
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

Happy Equation
(这道题当时没做出来,后来比赛结束,看的网上的大佬的思路和代码,学习的,最后自己整理的)
题意:
求满足ax≡xa(mod 2p)在1-2^p范围内的X的个数
思路:
1.当a为奇数的时候,为1。
2.当a为偶数的时候a=2x
指数<n时,用暴力
指数>n时,求出在m中₂x的倍数

#include<bits/stdc++.h>
#define ll long long
using namespace std;

long long pg(ll a,ll b,ll mod)
{ 
	ll temp=a,ans=1;
	while(b!=0)
	{ 
		if(b&1)
        ans=(ans*temp)%mod;
		temp=(temp*temp)%mod;
		b>>=1;
	}
	return ans;
}
//打表函数
void init()
{ 
	ll ans=0;
	ll mod=1<<20;
	for(int a=1;a<=50;a++)
	{ 
		for(int i=1;i<=20;i++)
		{ 
			if(pg(a,i,mod)%mod==pg(i,a,mod)%mod)
			{ 
				ans++;
			}
		}
		if(a&1)	cout<<"奇数"<<endl;
		cout<<ans<<endl;

		ans=0;
	}

}
int main()
{ 
// init();
	ll t;
	cin>>t;
	while(t--)
	{ 
		ll a,p;
		cin>>a>>p;
		if(a&1)
		{ 
			cout<<"1"<<endl;
			continue;
		}
		else
		{ 
			ll ans=0;
			ll mod=1<<p;
			for(int i=1;i<=p;i++)
			{ 
				if(pg(a,i,mod)%mod==pg(i,a,mod)%mod)
				{ 
					ans++;
				}
			}
			ll q1;
				q1=p/a;
			if(p%a)
				q1++;
			ll l=1<<q1;
			ans+=(mod/l-p/l);
			cout<<ans<<endl;
		}

	}
	return 0;
}

Game on a Graph
题意:
给出一个连通图的节点数,边数
有两个队伍,给出一个顺序代表顺序轮到哪个队伍,就要在这个图中删去一条边,如果删去某一条边图不连通了,这个队伍就失败,最后输出胜利的队伍
思路:
关键在于搞清楚不连通时的临界状态,不连通的前一个状态就是形成了一个单只的图(每两个顶点只有一条边相连)n个点的图若要联通,最少要n-1条边。

#include<bits/stdc++.h>
using namespace std;
//speed_up
int main()
{ 
    long long t,n;
    string s;
    cin>>t;
    while(t--)
    { 
        long long a1,a2,a3;
        cin>>n>>s>>a1>>a2;
        for(int i=0;i<a2;++i)
        { 
            cin>>a3>>a3;
        }
        long long ans=(a2-a1+1)%n;
        if(s[ans]=='2')
        { 
            cout<<1<<endl;
        }
        else
        { 
            cout<<2<<endl;
        }
    }
}

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服