A Easy h-index
比赛题目:
http://acm.hdu.edu.cn/downloads/2018ccpc_hn.pdf

The h-index of an author is the largest h where he has at least h papers with citations not less than h.

Bobo has published many papers.
Given a0,a1,a2,…,an which means Bobo has published ai papers with citations exactly i, find the h-index of Bobo.

Input
The input consists of several test cases and is terminated by end-of-file.

The first line of each test case contains an integer n.
The second line contains (n+1) integers a0,a1,…,an.

Output
For each test case, print an integer which denotes the result.

Constraint

  • 1≤n≤2⋅105
  • 0≤ai≤109
  • The sum of n does not exceed 250,000.

Sample Input
1
1 2
2
1 2 3
3
0 0 0 0

Sample Output
1
2
0

思路:后缀和
代码:

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

typedef long long ll;
const int N = 2e5+5;

ll a[N];
int main() {
    int n;
    while(cin>>n) {
        for(int i=0; i<=n; i++)
            cin>>a[i];
        int ans;
        ll sum=0;
        for(int i=n+1; i>=0&&sum<i; ) {
            sum+=a[--i];
            ans=i;
        }
        cout<<ans<<endl;
    }
    return 0;
}

B Higher h-index

Problem Description
The h-index of an author is the largest h where he has at least h papers with citations not less than h.

Bobo has no papers and he is going to publish some subsequently.
If he works on a paper for x hours, the paper will get (a⋅x) citations, where a is a known constant.
It’s clear that x should be a positive integer.
There is also a trick – one can cite his own papers published earlier.

Given Bobo has n working hours, find the maximum h-index of him.

Input
The input consists of several test cases and is terminated by end-of-file.

Each test case contains two integers n and a.

Output
For each test case, print an integer which denotes the maximum h-index.

Constraint

  • 1≤n≤109
  • 0≤a≤n
  • The number of test cases does not exceed 104.

Sample Input
3 0
3 1
1000000000 1000000000

Sample Output
1
2
1000000000

Hint

For the first sample, Bobo can work 3 3 papers for 11 hour each.
With the trick mentioned, he will get papers with citations 2,1,0 2 , 1 , 0 . Thus, his h h -index is 11.

For the second sample, Bobo can work 2 2 papers for 11 and 2 2 hours respectively. He will get papers with citations 1+1,2+01+1,2+0. Thus, his h h -index is 22.

思路:比赛的时候没看这题。。 赛后正解就是一个结论。 (n+a)/2向下取整

Problem Description
Bobo has n tuples (a1,b1,c1),(a2,b2,c2),…,(an,bn,cn).
He would like to find the lexicographically smallest permutation p1,p2,…,pn of 1,2,…,n such that for i∈{2,3,…,n} it holds that
api−1+bpi−1api−1+bpi−1+cpi−1≤api+bpiapi+bpi+cpi.

Input
The input consists of several test cases and is terminated by end-of-file.

The first line of each test case contains an integer n.
The i-th of the following n lines contains 3 integers ai, bi and ci.

Output
For each test case, print n integers p1,p2,…,pn seperated by spaces.
DO NOT print trailing spaces.

Constraint

  • 1≤n≤103
  • 1≤ai,bi,ci≤2×109
  • The sum of n does not exceed 104.

Sample Input
2
1 1 1
1 1 2
2
1 1 2
1 1 1
3
1 3 1
2 2 1
3 1 1

Sample Output
2 1
1 2
1 2 3

思路:
现场赛时就直接计算,然后用double比较大小排序了,但是这里用double表示不了
然后就转化所给的式子,交叉相乘化简。

代码:

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

typedef long long ll;
typedef unsigned long long ull;
const int N = 1e3+5;

struct Node {
    int id;
    ll a,b,c;
} p[N];
bool cmp(Node x,Node y) {
    ull tmp1=x.a*y.c+x.b*y.c;
    ull tmp2=y.a*x.c+y.b*x.c;
    if(tmp1!=tmp2)
        return tmp1<tmp2;
    return x.id<y.id;
}
int main() {
    int n;
    while(~scanf("%d",&n)) {
        for(int i=0; i<n; i++) {
            scanf("%lld%lld%lld",&p[i].a,&p[i].b,&p[i].c);
            p[i].id=i+1;
        }
        sort(p,p+n,cmp);
        for(int i=0; i<n-1; i++) {
            printf("%d ",p[i].id);
        }
        printf("%d\n",p[n-1].id);
    }
    return 0;
}

G String Transformation
Problem Description
Bobo has a string S=s1s2…sn consists of letter a, b and c.
He can transform the string by inserting or deleting substrings aa, bb and abab.

Formally, A=u∘w∘v (“∘” denotes string concatenation) can be transformed into A′=u∘v and vice versa where u, v are (possibly empty) strings and w∈{aa,bb,abab}.

Given the target string T=t1t2…tm, determine if Bobo can transform the string S into T.

Input
The input consists of several test cases and is terminated by end-of-file.

The first line of each test case contains a string s1s2…sn.
The second line contains a string t1t2…tm.

Output
For each test case, print Yes if Bobo can. Print No otherwise.

Constraint

  • 1≤n,m≤104
  • s1,s2,…,sn,t1,t2,…,tm∈{a,b,c}
  • The sum of n and m does not exceed 250,000.

Sample Input
ab
ba
ac
ca
a
ab

Sample Output
Yes
No
No

Hint

For the first sample, Bobo can transform as ab => aababb => babb => ba.

思路:
找c的个数,若c的个数不相等,直接输出No;反之,就按照c的位置划分,比较a,b的个数的奇偶性, 只有奇偶性都相同时输出Yes,否则输出No

代码:

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

typedef long long ll;
typedef unsigned long long ull;
const int N = 1e3+5;

bool check(int a,int aa,int b,int bb) {
    if(a%2!=aa%2||b%2!=bb%2)
        return true;
    return false;
}
int main() {
    string s,t;
    while(cin>>s>>t) {
        int sz1=s.size();
        int sz2=t.size();
        int cnt1c=0,cnt2c=0;
        for(int i=0; i<sz1; i++) {
            if(s[i]=='c')
                cnt1c++;
        }
        for(int i=0; i<sz2; i++) {
            if(t[i]=='c')
                cnt2c++;
        }
       // printf("cnt1c=%d cnt2c=%d\n",cnt1c,cnt2c);
        if(cnt1c!=cnt2c)
            cout<<"No";
        else if(cnt1c==cnt2c&&!cnt2c) {
            int acnt=0,aacnt=0;
            int bcnt=0,bbcnt=0;
            for(int i=0; i<sz1; i++) {
                if(s[i]=='a')
                    acnt++;
                else
                    bcnt++;
            }
            for(int i=0; i<sz2; i++) {
                if(t[i]=='a')
                    aacnt++;
                else
                    bbcnt++;
            }
            if(check(acnt,aacnt,bcnt,bbcnt)) {
                cout<<"No";
            } else
                cout<<"Yes";
        } else {
            bool flag=0;
            int acnt=0,aacnt=0;
            int bcnt=0,bbcnt=0;
            int i,j,k;
            for(i=0,j=0; i<sz1; i++) {
                if(s[i]=='c') {
                    for(k=j; k<sz2&&t[k]!='c'; k++) {
                        if(t[k]=='a')
                            aacnt++;
                        else
                            bbcnt++;
                    }
                    if(check(acnt,aacnt,bcnt,bbcnt)) {
                        flag=1;
                        break;
                    }
                    j=k+1;
                } else {
                    if(s[i]=='a')
                        acnt++;
                    else
                        bcnt++;
                }
            }
            for(int i=j; i<sz2; i++) {
                if(t[i]=='a')
                    aacnt++;
                else
                    bbcnt++;
            }
            if(check(acnt,aacnt,bcnt,bbcnt)) {
                flag=1;
            }
            if(!flag)
                cout<<"Yes";
            else
                cout<<"No";
        }
        cout<<endl;
    }
    return 0;
}

K 2018
Problem Description
Given a,b,c,d, find out the number of pairs of integers (x,y) where a≤x≤b,c≤y≤d and x⋅y is a multiple of 2018.

Input
The input consists of several test cases and is terminated by end-of-file.

Each test case contains four integers a,b,c,d.

Output
For each test case, print an integer which denotes the result.

Constraint

  • 1≤a≤b≤109,1≤c≤d≤109
  • The number of tests cases does not exceed 104.

Sample Input
1 2 1 2018
1 2018 1 2018
1 1000000000 1 1000000000

Sample Output
3
6051
1485883320325200

思路:
这道题和12届湖南省赛的2016这道题很像,然后就直接按那个思路写了半天,现场比较懵,就没想到直接找因子计算
2018的因子有1,2,1009,2018,计算四次得到答案

代码:

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

typedef long long ll;
typedef unsigned long long ull;
const int N = 1e3+5;

ll cal(int x,int y,int d) {
    ll ans=y/d-(x-1)/d;
    return ans;
}
int main() {
    int a,b,c,d;
    while(~scanf("%d%d%d%d",&a,&b,&c,&d)) {
        ll t1=cal(a,b,2);
        ll t2=cal(a,b,1009);
        ll t3=cal(a,b,2018);
        ll t4=cal(c,d,2);
        ll t5=cal(c,d,1009);
        ll t6=cal(c,d,2018);
        ll ans1=(t2-t3)*t4; /// [0,a)中1009的奇数倍的个数 * [c,d]中偶数个数
        ll ans2=t3*(d-c+1); /// [a,b]中2018的倍数个数 * [c,d]中所有数个数
        ll ans3=(t5-t6)*(t1-t3);/// [a,b]中偶数个数 * [c,d]中1009奇数倍的个数 ,去掉已经计算过的2018
        ll ans4=t6*(b-a+1-t2);/// [a,b]中所有数个数 * [c,d]中2018的倍数个数 ,去掉已经计算过的1009
        printf("%lld\n",ans1+ans2+ans3+ans4);
    }
    return 0;
}