2018 湘潭邀请赛ccpc部分题解(A B F G K)

127 篇文章 0 订阅
85 篇文章 2 订阅

A-Easy h-index
读懂题是关键,h-index表示:一个最大的h满足至少有h篇论文并且引用次数不超过h。
给出的数据是 a0 a 0 , a1 a 1 , a2 a 2 , a3 a 3 …. ai a i 表示已经发表了 ai a i 篇论文并且引用次数为i。求h-index。
所以从大到小枚举就好了啊,用后缀和表示现在已经有多少篇论文,枚举到后缀和>=引用次数即可,输出i即是答案。
比如样例2,从后往前枚举

已有论文引用次数
32

正好满足条件。
样例3

已有论文引用次数
03
0+02
0+0+01
0+0+0+00

所以答案为0

#include<bits/stdc++.h>
#define maxn 200010
using namespace std;
int n,sum;
int a[maxn];
int main(){
    //freopen("in.txt","r",stdin);
    while(~scanf("%d",&n)){
        memset(a,0,sizeof(a));
        sum=0;
        for(int i=0;i<=n;i++){
            scanf("%d",&a[i]);
        }
        for(int i=n;i>=0;i--){
            sum += a[i];
            if(sum>=i){
                printf("%d\n",i);
                break;
            }
        }
    }
    return 0;
}

B-Higher h-index
找规律…(n+a)/2

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int a,b;
    while (cin>>a>>b)
    {
        cout<<(a+b)/2<<endl;
    }
    return 0;
}

F-Sorting
也算签到题吧…long double可以过的,实在不行就交叉相乘一下。
就是有一点要注意,如果 api1+bpi1api1+bpi1+cpi1 a p i − 1 + b p i − 1 a p i − 1 + b p i − 1 + c p i − 1 = = api+bpiapi+bpi+cpi,此时需要满足左面的下标要 < < <script type="math/tex" id="MathJax-Element-32"><</script>右面的下标

#include <bits/stdc++.h>
#include <algorithm>

using namespace std;

struct num{
    int dx;
    long double sum;
}d[1001];

bool cmp(num x,num y)
{
    if(x.sum==y.sum)//此处是重点
        return x.dx<y.dx;
    return (x.sum<y.sum);
}

int main() {
    int n;
    while(~scanf("%d",&n))
    {
        int a,b,c;
        for(int i = 0; i < n; ++i){
            scanf("%d%d%d",&a,&b,&c);
            long double t = a*1.0;
            t += b*1.0;
            t = t/(t+c*1.0);
            d[i].sum = t;//(long double)(a+b)/(long double)(a+b+c)不可以这样写,会爆int;
            d[i].dx = i+1;
        }
        sort(d,d+n,cmp);
        for(int i = 0; i < n; ++i){
            printf("%d%c",d[i].dx,i==n-1?'\n':' ');
        }
    }
    return 0;
}

G-String Transformation
也是找规律吧…这个规律就是如果c的个数不同一定是No,如果相同,那么就判断以c为分割的区间内a和b的奇偶性,如果相同就是Yes否则就是No。
但是小伙伴们想没想到可以用异或来做哩~想一想异或的性质(a^0=a,a^a=0,b^a^a=b),对以c为分割点的区间异或,最后剩下的肯定是a或者b或者ab或者ba组成的集合,最后判断这两个集合是否相同即可。

#include <bits/stdc++.h>

using namespace std;
const int N = 1e4+1;
char s[N],b[N];

string solve(char *s)
{
    string b = "";
    int sum = 0;
    for(int i = 0; s[i]; ++i){
        if(s[i]=='c')
            b+=sum, sum = 0;
        else
            sum ^= s[i];
    }
    return b+=sum;
}

int main()
{
    while(cin>>s>>b)
    {
        puts((solve(s).compare(solve(b))==0)?"Yes":"No");
    }
    return 0;
}

K-2018
题意就是求有多少对 x,y(a<=x<=b,c<=y<=d) x , y ( a <= x <= b , c <= y <= d ) 满足 (xy)mod2018=0 ( x ∗ y ) m o d 2018 = 0
这里2018很特殊,因子只有1,2,1009,2018四个,所以我们只要求出 [a,b] [ a , b ] 区间和 [c,d] [ c , d ] 区间内的因子个数即可,就是要注意会有重复计算的,具体看注释吧~

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

ll count(int a,int b,int v)//计算区间[a,b]内v的因子个数
{
    return b/v-(a-1)/v;
}

int main()
{
    int a,b,c,d;
    while (cin>>a>>b>>c>>d)
    {
        ll s1 = count(a,b,2), s2 = count(a,b,1009), s3 = count(a,b,2018);
        ll b1 = count(c,d,2), b2 = count(c,d,1009), b3 = count(c,d,2018);
        ll F = (s2-s3)*b1; //左边1009奇数倍的个数乘以右边偶数个数
        ll U = s3*(d-c+1); //左边2018的倍数的个数乘以右边的所有的数
        ll C = (b2-b3)*(s1-s3); //右边1009奇数倍的个数乘以左边偶数的个数(因为2018的倍数同样是偶数,在U里面已经计算过,所以要减去)
        ll K = b3*(b-a+1-s2); //右边2018的倍数的个数乘以左边所有的数(同样要减去已经计算过的1009奇数倍的个数)
        cout<<F+U+C+K<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值