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;
}
}
}