度度熊最近学习了多项式和极限的概念。
现在他有两个多项式 f(x)和g(x),他想知道当 x趋近无限大的时候,f(x) /g(x) 收敛于多少。
#include
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin>>n;
while(n--)
{
int t, mfxi=0, mfmi =0, mgxi = 0, mgmi =0;
cin>>t;
for(int i=0;i<t;i++)
{
int xi;
cin>>xi;
if(xi!=0){mfmi=i;mfxi=xi;}
}
for (int i = 0; i < t; i++)
{
int xi;
cin >> xi;
if (xi != 0){mgmi = i;mgxi = xi;}
}
if(mfmi>mgmi)cout<<"1/0"<<'\n';
else if(mfmi<mgmi)cout<<"0/1"<<'\n';
else {
int zi=mfxi,mu=mgxi;
for(int i=min(zi,mu);i>1;i--){
if(zi%i==0&&mu%i==0)zi/=i,mu/=i;
}
cout<<zi<<'/'<<mu<<'\n';
}
}
return 0;
}
度度熊在玩一个好玩的游戏。 游戏的主人公站在一根数轴上,他可以在数轴上任意移动,对于每次移动,他可以选择往左或往右走一格或两格。
现在他要依次完成n个任务,对于任务i,只要他处于区间[ai,bi]上,就算完成了任务。 度度熊想知道,为了完成所有的任务,最少需要移动多少次? 度度熊可以任意选择初始位置。
#include
using namespace std;
typedef pair<int,int> pr;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
vector<pr> v(n);
for(int i=0;i<n;i++)cin>>v[i].first>>v[i].second;
vector<pr>::iterator it;
for(it=v.begin();it<v.end()-1;)
{ //v[i] v[i+1]
if (((*it).second >= (*(it + 1)).first && (*it).second <= (*(it + 1)).second) || ((*it).first <= (*(it + 1)).second && (*it).first >= (*(it + 1)).first) || ((*it).first <= (*(it + 1)).first && (*it).second >= (*(it + 1)).second))//判断两个区间是否重合
{
(*it).first = max((*it).first, (*(it + 1)).first);
(*it).second = min((*it).second, (*(it + 1)).second);
it=v.erase(it+1)-1;
n--;
}
else it++;
}
int res=0;
int loc=0;
int i=0,dif;
if (v[0].second < v[1].first)loc = v[0].second;
if (v[0].first > v[1].second)loc = v[0].first;
for(i=1;i<n-1;i++)
{ //分两种情况:v[i]表示的区间在v[i+1]的左(右)边
if(v[i].second<v[i+1].first)
{
dif=v[i].second-loc;
if(dif>0){ //判断两次位移是否同方向
if(dif&1&&v[i].first<v[i].second){ //满足合并条件
loc=v[i].second-1;
dif--;
}
else loc=v[i].second;
res+=(dif+1)/2;
}
else {
loc=v[i].second;
res+=(-dif+1)/2;
}
}
if(v[i].first>v[i+1].second){
dif=(v[i].first-loc);
if(dif<0){
dif=-dif;
if(dif&1&&v[i].first<v[i].second){
loc=v[i].first+1;
dif--;
}
else loc=v[i].first;
res+=(dif+1)/2;
}
else {
loc=v[i].first;
res+=(dif+1)/2;
}
}
}
if(n!=1)
{ //处理最后一次任务
if(v[i].first>loc)dif=v[i].first-loc;
else dif=loc-v[i].second;
res+=dif/2+dif%2;
}
/*for (int i = 0; i < n; i++)
cout << v[i].first << ' ' << v[i].second << endl;*/
cout<<res<<'\n';
}
return 0;
}
度度熊有一个递推式 an=(∑i=1n−1ai∗i)%n. 其中 a1=1。现给出 n,需要求 an。
#include
using namespace std;
#define LL long long
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
while(t--)
{
LL n;
cin>>n;
LL res;
//switch
if(n%6==1)res=1+4*(n/6);
else if(n%6==2){
res=1+3*(n/6);
}
else if(n%6==3||n%6==5){
res=0+n/6;
}
else if(n%6==4)res=3+6*(n/6);
else if(n%6==0)res=3*(n/6);
cout<<res<<'\n';
}
return 0;
}
平面上有 n 个矩形,矩形的边平行于坐标轴,现在度度熊需要操控一名角色从 A 点走到 B 点。
该角色可以上下左右移动,在恰被 k 个矩形覆盖的区域,该角色的速率为 k+1 个距离/秒(矩形覆盖区域包括边界)。请求出 A 移动到 B 最快需要多少秒。
#include
using namespace std;
const int MAXN=405;//离散化处理坐标,200个矩形,400个点
const int INF=0x3f3f3f3f;
int dx[MAXN],dy[MAXN],nx,ny;//坐标点,有序,不重,index从1开始
int num_hor[MAXN][MAXN],num_ver[MAXN][MAXN];//竖直或水平方向上的点 被多少个矩形覆盖
double time_[MAXN][MAXN];//bfs得到的最短时间数组
int begin_x,end_x,begin_y,end_y;//起点和终点
bool vis[MAXN][MAXN];//bfs用的vis标记数组
int dir[4][2]={1,0,-1,0,0,-1,0,1};//方向数组
struct rectangle
{
int x1,y1,x2,y2;
}ret[MAXN/2];//坐标
struct Node
{
int x,y;
bool operator<(const Node &a) const
{ //重载运算符,定义time_[][]值较大的数据优先级较小
return time_[x][y]>=time_[a.x][a.y];
}
};
void bfs();
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
while(t--)
{
int n;cin>>n;
nx=0,ny=0;
for(int i=0;i<n;++i)
{
cin>>ret[i].x1>>ret[i].y1>>ret[i].x2>>ret[i].y2;
dx[++nx] = ret[i].x1;dx[++nx] = ret[i].x2;
dy[++ny] = ret[i].y1;dy[++ny] = ret[i].y2;
}
cin>>begin_x>>begin_y>>end_x>>end_y;
dx[++nx]=begin_x,dx[++nx]=end_x;
dy[++ny]=begin_y,dy[++ny]=end_y;
sort(dx+1,dx+1+nx);
sort(dy+1,dy+1+ny);
nx = unique(dx+1,dx+nx+1)-dx-1;
ny = unique(dy+1,dy+ny+1)-dy-1;//"去重",更新nx,xy
//接下来求num_hor[],num_vir[]
//初始化
for(int i=1;i<=nx;++i)
for(int j=1;j<=ny;++j)
num_ver[i][j]=num_hor[i][j]=1;
for(int i=0;i<n;++i)
{
ret[i].x1=lower_bound(dx+1,dx+nx+1,ret[i].x1)-dx;
ret[i].x2=lower_bound(dx+1,dx+nx+1,ret[i].x2)-dx;
ret[i].y1=lower_bound(dy+1,dy+ny+1,ret[i].y1)-dy;
ret[i].y2=lower_bound(dy+1,dy+ny+1,ret[i].y2)-dy;
//把坐标点数据转换为其在dx[]dy[]中对应的index
//接下来求出 水平和垂直两种不同的移动方式下的 num数组(记录点上矩形的个数)
for(int j=ret[i].x1;j<=ret[i].x2;++j)
{
for(int k=ret[i].y1;k<ret[i].y2;++k)
num_ver[j][k]++;
//垂直移动的时候,矩形上边界的点不计入该矩形内
}
for (int j = ret[i].x1; j < ret[i].x2; ++j)
{
for (int k = ret[i].y1; k <= ret[i].y2; ++k)
num_hor[j][k]++;
//同理,水平移动的时候,矩形右边界的点不计入该矩形内
}
}
begin_x = lower_bound(dx + 1, dx + 1 + nx, begin_x) - dx;
begin_y = lower_bound(dy + 1, dy + 1 + ny, begin_y) - dy;
end_x = lower_bound(dx + 1, dx + 1 + nx, end_x) - dx;
end_y = lower_bound(dy + 1, dy + 1 + ny, end_y) - dy;
time_[begin_x][begin_y]=0;
bfs();
cout<<fixed<<setprecision(5)<<time_[end_x][end_y]<<'\n';
}
return 0;
}
void bfs()
{ //bfs+优先队列
for(int i=1;i<=nx;++i)
for(int j=1;j<=ny;++j)
{time_[i][j]=INF,vis[i][j]=false;}
priority_queue<Node, vector<Node>, less<Node>> que;
time_[begin_x][begin_y]=0;
Node node;
node.x=begin_x;node.y=begin_y;
que.push(node);
while(!que.empty())
{
int x,y;
x=que.top().x;y=que.top().y;
que.pop();
if(vis[x][y])continue;
vis[x][y]=true;
if(x==end_x&&y==end_y)break;
for(int i=0;i<4;++i)
{
int xx,yy;
xx=x+dir[i][0];
yy=y+dir[i][1];
if(!xx||!yy||xx>nx||yy>ny||vis[xx][yy])
continue;
double tm;
if(x==xx)//垂直移动
tm=1.0*abs(dy[yy]-dy[y])/num_ver[x][min(y,yy)];
else //水平移动
tm=1.0*abs(dx[xx]-dx[x])/num_hor[min(x,xx)][y];
if(time_[x][y]+tm<time_[xx][yy])
{
time_[xx][yy]=time_[x][y]+tm;
node.x=xx,node.y=yy;
que.push(node);
}
}
}
}