Educational Codeforces Round 118 (Rated for Div. 2)

1,A. Long Comparison-Educational Codeforces Round 118 (Rated for Div. 2)

题意:给出x1,y1,x2,y2。x1,x2表示基数,y1,y2表示后面乘10的多少次方(例如x1=29,y1=3,表示的数就是29000)。要求判断x1乘10的y1次方大还是x2乘10的y2次方大。

题解:首先判断x1.size()+n和x2.size()+m的大小,如果前者大就输出大于号,如果是后者大就输出小于号,如果相等就执行下面的操作。k=max(x1.size(),x2.size()),然后把较小的字符串后面加零补成一样长,然后从第一个数,开始比较大小,如果比较结束都是一样的大小就直接输出等于号。

解释:y1,y2是10的6次方,如果把整个字符串补齐就太慢了。首先判断位数,比较容易。之后诸位开始判断因为后面的都是零没有意义,所以就只进行前面输入的数字进行比较。

代码:

#include<iostream>
#include<string>
 
using namespace std;
string x,y;
 
int main()
{
    int t;
    cin >> t;
    int n,m;
    while(t--)
    {
    cin >> x>>n;
    cin>>y>>m;
    if(x.size()+n>y.size()+m) cout<<'>'<<endl;
    else if(x.size()+n<y.size()+m) cout<<'<'<<endl;
    else {
    int z=max(x.size(),y.size());
    for(int i1=0;i1<z;i1++)
    {
    if(x.size()<=z-1) x+='0';
    else if(y.size()<=z-1) y+='0';
    
    if(x[i1]>y[i1]) {cout<<'>'<<endl;break;}
    else if(x[i1]<y[i1]) {cout<<'<'<<endl;break;}
    else if(i1==z-1) cout<<'='<<endl;
  
      }
    
    }
    
    }
    return 0;
}

2,B. Absent Remainder-Educational Codeforces Round 118 (Rated for Div. 2)

题意:给出含有n个整数的数组a,要求任意的x,y属于a且x!=y,使得x%y的值不在a中,找出[n/2]对符合条件的x,y。

题解,从小到大排序。令y=a[1]。i1从n开始令x=a[i1],输出n/2个即可。

解释:因为排完序之后没有比a[1]更小的元素了。
代码;


#include<iostream>
#include<algorithm>
#include<map>
 
using namespace std;
int a[200010];
map<int,int> it;
int main()
{
    int t,n,i1,i2,i3,i4,i5;
    cin >> t;
    while(t--)
    {
    cin >> n;
    it.clear();
    for(i1=1;i1<=n;i1++)
     cin >> a[i1];
    sort(a+1,a+1+n);
    int num=1;
    for(i1=n;i1>=n/2,num<=n/2;num++,i1--)
    cout <<a[i1]<<" " <<a[1]<< endl;
    }
    return 0;
}

3, C. Poisoned Dagger-Educational Codeforces Round 118 (Rated for Div. 2)

题意:有一条巨龙血量为h。你有一把匕首,匕首本身对巨龙不造成伤害,但是匕首带有剧毒,可以对巨龙进行扣除生命值。毒性有一定的持续时间。匕首的毒性不可以叠加,但是可以刷新,也就是在如果毒性可以持续4秒,在第一秒时使用,在第3秒时再次使用,可以持续到第6秒。问题,如果有n次攻击巨龙的机会,计算出最小的毒性持续时间k值,使得能使的巨龙的h为零。

题解1:用二分的方法,将剧毒的持续时间为变量。如果小于时间间隔就直接加时间,否则就加剧毒的持续时间。

题解2:其实不用二分,贪心也可以,但是很难想,我看了同学写的代码也没懂,有兴趣的同学可以从网上查一下。将每次攻击的时间间隔作为数组元素,然后排序,最后加上一个元素是巨龙的总血量。每次都是剩余的血量除剩下的回合,假设当前的时间间隔是最短的毒性持续时间。

解释:正常的二分和非常难想的贪心。但是都比较规矩。

代码:

/**
 *@author wrcccccccc 
 */
#include<iostream>
using namespace std;
#define ll long long
 
ll a[105];
 
int main()
{
    int t;
    cin >> t;
    ll n,m,i1,i2,i3,i4,i5;
    while(t--)
    {
     cin >> n>>m;
    for(i1=1;i1<=n;i1++)
    cin >> a[i1];
    ll l=1,r=m,mid,ans;
    while(l<=r)
    {
    mid=(l+r)/2;
    ll  p=0;
    for(i1=1;i1<n;i1++)
    {
    if(a[i1+1]-a[i1]<mid) p+=a[i1+1]-a[i1];
    else p+=mid;
    }
    p+=mid;
    if(p>=m) {r=mid-1;ans=mid;}
    else l=mid+1;
    }
    cout << ans<< endl;
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值