省赛训练赛(---)

A.HDU4968

最大gpa为从最大区间开始,每次取区间最小分数。

最小gap为从最小区间开始,每次取区间最大分数。

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

int ave,n;
int x[10] = {0,85,80,75,70,60};
double xx[10] = {0,4,3.5,3,2.5,2};
int y[10] = {0,69,74,79,84,100};
double yy[10] = {0,2,2.5,3,3.5,4};

int main()
{
    ios::sync_with_stdio(false);
    int T;
    cin >> T;
    while(T--)
    {
        cin >> ave >> n;
        double sum1 = 0,sum2 = 0;
        int total = ave*n,now = 1;
        for(int i = 1;i <= n;i++)
        {
            while(total-x[now] < 60*(n-i))  now++;
            total -= x[now];
            sum1 += xx[now];
        }
        total = ave*n,now = 1;
        for(int i = 1;i <= n;i++)
        {
            while(total-y[now] > 100*(n-i)) now++;
            total -= y[now];
            sum2 += yy[now];
        }
        cout << fixed << setprecision(4) << sum2/n << " " << fixed << setprecision(4) << sum1/n << endl;
    }
    return 0;
}



B.HDU4970

先求每点受的伤害,然后求后缀和。

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

int n,m,k;
long long a[100005],b[100005];

int main()
{
    ios::sync_with_stdio(false);
    while(cin >> n && n)
    {
        cin >> m;
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        for(int i = 1;i <= m;i++)
        {
            int l,r,x;
            cin >> l >> r >> x;
            a[r] += x;
            a[l-1] -= x;
        }
        for(int i = n;i >= 1;i--)
        {
            a[i] += a[i+1];
            b[i] = a[i]+b[i+1];
        }
        cin >> k;
        int ans = 0;
        while(k--)
        {
            long long h,x;
            cin >> h >> x;
            if(h > b[x])    ans++;
        }
        cout << ans << endl;
    }
    return 0;
}



C.HDU4864

工作和机器都先按时间降序,再按难度降序。

因为时间是降序的,我们从头到尾处理工作,把大于工作时间的机器拿出来,则它们对之后工作的时间都是满足的,每个工作,我们优先处理时间大的工作,因为难度对money的影响可以忽略。

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

int n,m,c[105];
struct xx
{
    int x,y;
    friend bool operator <(xx a,xx b)
    {
        if(a.x != b.x)  return a.x > b.x;
        return a.y > b.y;
    }
}a[100005],b[100005];

int main()
{
    ios::sync_with_stdio(false);
    while(cin >> n >> m)
    {
        for(int i = 1;i <= n;i++)   cin >> a[i].x >> a[i].y;
        for(int i = 1;i <= m;i++)   cin >> b[i].x >> b[i].y;
        sort(a+1,a+1+n);
        sort(b+1,b+1+m);
        memset(c,0,sizeof(c));
        int now = 1;
        int cnt = 0;
        long long ans = 0;
        for(int i = 1;i <= m;i++)
        {
            while(now <= n && a[now].x >= b[i].x)
            {
                c[a[now].y]++;
                now++;
            }
            for(int j = b[i].y;j <= 100;j++)
            {
                if(c[j])
                {
                    c[j]--;
                    cnt++;
                    ans += 500*b[i].x+2*b[i].y;
                    break;
                }
            }
        }
        cout << cnt << " " << ans << endl;
    }
    return 0;
}



D.HDU4866



E.HDU4867



F.HDU4869

不管怎么变,最后0和1的个数奇偶性不变,我们计算出最少的1的个数和最多的1的个数,这个区间内,相隔2都是符合的,因为翻牌是任意的,所以m个数中选i个1是组合数,预处理一下阶乘。

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

int n,m;
long long f[100005];
long long qpower(long long a,long long b,long long c)
{
    long long ans = 1;
    a = a%c;
    while(b)
    {
        if(b%2) ans = ans*a%c;
        a = a*a%c;
        b /= 2;
    }
    return ans;
}
int main()
{
    ios::sync_with_stdio(false);
    f[0] = 1;
    for(int i = 1;i <= 100000;i++)  f[i] = f[i-1]*i%MOD;
    while(cin >> n >> m)
    {
        int l = 0,r = 0;
        for(int i = 1;i <= n;i++)
        {
            int x;
            cin >> x;
            int ll = l,rr = r;
            if(x < ll)  l = ll-x;
            else if(x < rr) l = ll%2 == x%2?0:1;
            else    l = x-rr;
            if(x < m-rr)   r = rr+x;
            else if(x < m-ll)  r = (m-rr)%2 == x%2?m:m-1;
            else    r = 2*m-ll-x;
        }
        long long ans = 0;
        for(int i = l;i <= r;i += 2)
        {
            ans = (ans+f[m]*qpower(f[i]*f[m-i],MOD-2,MOD)%MOD)%MOD;
        }
        cout << ans << endl;
    }
    return 0;
}



G.HDU4960

dp[i][j]代表将区间i-j合并乘回文串的最小花费,递归处理,过程中记忆化一下。

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

int n,a[5005],cost[5005],dp[5005][5005];
long long sum[5005];

int dfs(int l,int r)
{
    if(l >= r)  return 0;
    if(dp[l][r] != -1)  return dp[l][r];
    dp[l][r] = cost[r-l+1];
    int ll = l,rr = r;
    while(ll < rr)
    {
        while(ll < rr && sum[ll]-sum[l-1] < sum[r]-sum[rr-1])  ll++;
        while(ll < rr && sum[ll]-sum[l-1] > sum[r]-sum[rr-1])  rr--;
        if(ll < rr && sum[ll]-sum[l-1] == sum[r]-sum[rr-1])
        {
            dp[l][r] = min(dp[l][r],dfs(ll+1,rr-1)+cost[ll-l+1]+cost[r-rr+1]);
            ll++;
        }
    }
    return dp[l][r];
}
int main()
{
    ios::sync_with_stdio(false);
    while(cin >> n && n)
    {
        memset(sum,0,sizeof(sum));
        memset(dp,-1,sizeof(dp));
        for(int i = 1;i <= n;i++)   cin >> a[i];
        for(int i = 1;i <= n;i++)   cin >> cost[i];
        for(int i = 1;i <= n;i++)   sum[i] = sum[i-1]+a[i];
        cout << dfs(1,n) << endl;
    }
    return 0;
}



H.HDU4961

从左往右扫一遍,更新当前可行约数的最新值,这样b肯定为最接近的。

从右往左扫一遍,同上。

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

int n,a[100005],b[100005],c[100005],vis[100005];

int main()
{
    ios::sync_with_stdio(false);
    while(cin >> n && n)
    {
        for(int i = 1;i <= n;i++)   cin >> a[i];
        memset(vis,0,sizeof(vis));
        for(int i = 1;i <= n;i++)
        {
            if(vis[a[i]])   b[i] = a[vis[a[i]]];
            else    b[i] = a[i];
            for(int j = 1;j <= sqrt(a[i]+0.5);j++)
            {
                if(a[i]%j == 0)
                {
                    vis[j] = i;
                    vis[a[i]/j] = i;
                }
            }
        }
        memset(vis,0,sizeof(vis));
        for(int i = n;i >= 1;i--)
        {
            if(vis[a[i]])   c[i] = a[vis[a[i]]];
            else    c[i] = a[i];
            for(int j = 1;j <= sqrt(a[i]+0.5);j++)
            {
                if(a[i]%j == 0)
                {
                    vis[j] = i;
                    vis[a[i]/j] = i;
                }
            }
        }
        long long ans = 0;
        for(int i = 1;i <= n;i++)   ans += (long long)b[i]*c[i];
        cout << ans << endl;
    }
    return 0;
}



I.HDU4963



J.HDU4966

时间: 2024-10-02 20:17:24

省赛训练赛(---)的相关文章

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&#39;s problem(manacher+二分/枚举)

HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分相同,第一部分与第二部分对称. 现在给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法,求出以第i个点为中心的回文串长度,记录到数组p中 要满足题目所要求的内容,需要使得两个相邻的回文串,共享中间的一部分,也就是说,左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也是一样. 因为我们已经记录下来以

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&amp;#39;s problem(manacher+二分/枚举)

pid=5371">HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分同样,第一部分与第二部分对称. 如今给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法.求出以第i个点为中心的回文串长度.记录到数组p中 要满足题目所要求的内容.须要使得两个相邻的回文串,共享中间的一部分,也就是说.左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也

最后一周第二天训练赛之第二题

试题: B - B Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice SPOJ ICODER Description Mathews uses a brand new 16-bit instruction processor. (Yeah i am being sarcastic!). It has one register (say R) and it su

Dream_Chaser队训练赛第一场 I题

Dream_Chaser队训练赛第一场 I题 题目来自2012成都区域赛 I - Count Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4472 Description Prof. Tigris is the head of an archaeological team who is currently in charge of a

2017后期 第 1 场训练赛

题目依次为 NKOJ 上 P3496 P4236 P3774 P2407 1.数三角形 方法很多, 比如推出三边 x y z 的限制关系, 然后加加减减得到计算式子 不过也可以用观察法, 暴力计算出 n 为 1 至 13 对应的结果为: 0 0 0 1 3 7 13 22 34 50 70 95 125 相邻两数差为: 0 0 1 2 4 6 9 12 16 20 25 30 这些相邻两数相邻差又为: 0 1 1 2 2 3 3 4 4 5 5 找到规律了, 如果结果第 i 项为第 i - 1

早晨训练赛第一场 B题 哈希

早晨训练赛第一场 B题 B - Trees in a Row Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 402B Description The Queen of England has n trees growing in a row in her garden. At that, the i-th (1 ≤ i 

zzuli训练赛_05_13-K

题意: 是输入N,2<=N<=100000,求N的质因子个数. 样例输入12 5 30 样例输出2 1 3 提示 12 = 2 * 2 * 3 5 = 5 30 = 2 * 3 * 5 解题思路: 就写个判断质数的函数,循环判断就可以,不过不是质数就加,是不同的质数. 具体代码: #include<iostream> #include<cmath> #include<cstring> using namespace std; bool temp[100000

校队训练赛,同时也是HDU4497(数论:素数分解+组合数学)

一.题目 http://acm.hdu.edu.cn/showproblem.php?pid=4497 二.思路 将满足条件的一组x,z,y都除以G,得到x‘,y',z',满足条件gcd(x',y',x') = 1,同时lcm(x',y',x') = G/L.特判,当G%L != 0 时,无解.然后素数分解G/L,假设G/L = p1^t1 * p2^t2 *````* pn^tn.满足上面条件的x,y,z一定为这样的形式.x' = p1^i1 * p2^i2 *```* pn^in.y' =

训练赛(1---5)D

一.题目 Description Sometimes you have to try fighting even though you know that your enemy is very powerful than you. Your hero with initial health H is about to fight against a venomous enemy who has a poisonous value of P. The enemy's poison deals i*