您好,欢迎来到画鸵萌宠网。
搜索
您的当前位置:首页upc暑期个人训练赛04

upc暑期个人训练赛04

来源:画鸵萌宠网

 


 

A: 月相

题意:

    牛牛最近在观察月相,他把月亮的大小分为 0~15 这16 个大小等级,月亮会在每个月先每天放大1,从0缓慢变大到15,然后再每天减小1,从15逐渐变成0,以此循环往复。牛牛连续观察了2天月亮的大小,牛牛想知道下一天月亮的大小是多少。

思路:

分递减递增两种普通情况和折返处的特殊情况,输出下一个数即可。

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{  int a,b;
   cin>>a>>b;
   if(a>b)
   { if(b!=0) cout<<b-1;
     else cout<<b+1;
   }
   else
   { if(b!=15) cout<<b+1;
     else cout<<b-1;
   }
}

B: 间隔

题意:

牛牛现在有一个从小到大排好序的整数序列A。他希望插入一些整数,使得相邻两两之间的差值一样大。牛牛想知道最少插入多少个整数才能满足要求,如果不能,则输出−1。

思路:

将相邻两个数的差存入元素差数组,求出数组元素的总的最大公约数,若为零则讨论原数组元素是否相等,相等则插入0个,不相等则无法达到目的;若不为零则用元素差数组除以最大公约数,求和输出。

代码:

#include<bits/stdc++.h>
using namespace std;
long long t,n,a[1000000],b[1000000],pp,pt,min1,sum,an,f(long long,long long);
int main()
{  
   cin>>t;
   while(t--)
    { cin>>n;
      pp=0;pt=0;min1=999999,sum=0;
      for(int i=1;i<=n;i++)
        cin>>a[i];
      for(int i=1;i<n;i++)
       { if(a[i+1]-a[i]==0) pt=1;
         if(a[i+1]-a[i]!=0)
          { pp=1;
            b[i]=a[i+1]-a[i];
          }
       }
      if(pt==1&&pp==0) cout<<"0";
      else if(pt==1&&pp==1) cout<<"-1";
      else
      { an=b[1];
        for(int i=2;i<n;i++)
           an=f(an,b[i]);
        for(int i=1;i<n;i++)
          sum+=b[i]/an-1;
        cout<<sum;
      }
     cout<<"\n";
    }
}
long long f(long long x,long long y)
{  long long a,b,c;
   a=x>y?x:y;
   b=x<y?x:y;
   while(b!=0)
   { c=b;
     b=a%b;
     a=c;
   }
   return a;
}

H: 伞 

题意:

Marser 记录下了雨伞旋转的角速度w(单位为 rad·s-1),半径r(单位为 m),以及雨伞边缘离地高度 h(单位为 m)。他要求你计算封闭图形的面积,其中,重力加速度 g 取 10 m·s-2

思路:

平抛运动求出s,结合r运用勾股定理求出所求图形的半径,输出面积。

 

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{  double w,r,h,t2,s2,R2,g=10,pi=3.14;
   cin>>w>>r>>h;
   t2=(2*h)/g;
   s2=w*w*r*r*t2;
   R2=r*r+s2;
   printf("%.3lf",pi*R2);
}

 

I: Move Right

题意:

有4个正方形水平排列。您将获得一个长度为 4 的字符串 S,该字符串由 0 和 1 组成。
如果 S 的第 i 个字符是 1,则从左边开始的第 i 个方块中有一个人;
如果 S 的第 i 个字符为 0,则从左侧开始的第 i 个方块中没有人。现在,每个人都将同时移动到右侧的下一个正方形。通过这一举动,原本在最右边方块的人将消失。确定移动后每个方块中是否有人。

思路:

水题。。。

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{  string s;
   cin>>s;
   cout<<"0";
   for(int i=0;i<s.length()-1;i++)
    cout<<s[i];
}

J: Unique Nicknames

题意:

有n个人,每人一个姓和名,每人以姓或名其中之一作为昵称,问每人的昵称能否各不相同且不与其他人的姓或名相同。

思路:

用map记录每个人名和姓在总人数中出现的次数,若有人的姓和名均出现超过一次,则不能满足要求。

代码:

#include<bits/stdc++.h>
using namespace std;
string a[10000],b[10000];
map<string,int>mp;
int main()
{  int n,pt=0;
   cin>>n;
   for(int i=1;i<=n;i++)
    {  cin>>a[i];
       scanf(" ");
       cin>>b[i];
       mp[a[i]]++;
       mp[b[i]]++;
    }
   for(int i=1;i<=n;i++)
      if(mp[a[i]]>1&&mp[b[i]]>1) {pt=1;break;}
   if(pt==0) cout<<"Yes";
   else cout<<"No";
}

K: 1 2 1 3 1 2 1

题意:

Sn(n 是大于或等于 2 的整数)是通过连接 Sn-1, n, Sn-1得到的序列,给出n,打印Sn。

思路:

循环更新,用vector记录上一次的和这一次的两个序列,其中用到insert()函数在一个vector的特定位置插入另一个vector的特定段。

代码:

#include<bits/stdc++.h>
using namespace std;
vector<int>p,pp;
int main()
{  int n;
   cin>>n;
   p.push_back(1);
   for(int i=2;i<=n;i++)
    {  pp.clear();
       pp.insert(pp.begin(),p.begin(),p.end());
       p.push_back(i);
       p.insert(p.end(),pp.begin(),pp.end());
    }
   vector<int>::iterator it;
   if(n==1) cout<<"1";
   else
   { for(it=p.begin();it!=p.end();it++)
       cout<<*it<<" ";
   }
}

 

 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo8.com 版权所有 湘ICP备2023022238号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务