upc暑期个人训练赛04

目录

 

A: 月相

题意:

思路:

代码:

B: 间隔

题意:

思路:

代码:

H: 伞 

题意:

思路:

代码:

I: Move Right

题意:

思路:

代码:

J: Unique Nicknames

题意:

思路:

代码:

K: 1 2 1 3 1 2 1

题意:

思路:

代码:


 

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

思路:

1cc188f083684527b62f68971d64c09e.png

平抛运动求出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<<" ";
   }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦木不emo

打赏一个吧亲

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值