Codeforces Round #FF(255) (Div. 2)

A题

/*
ID: neverchanje
PROG:
LANG: C++11
*/
#include<vector>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<set>
#include<queue>
#include<map>
using namespace std;
#define INF 0Xfffffff
#define maxn
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int,int> vii;

int p,n;
bool h[301];
int a[301];
int main(){
//    freopen("a.txt","r",stdin);
//    freopen(".out","w",stdout);
    while(cin>>p>>n){

        int x;bool find=0;
        memset(h,0,sizeof(h));
        for(int i=1;i<=n;i++)
            cin>>a[i];
        for(int i=1;i<=n;i++){
            if(h[a[i]%p]){
                cout<<i<<endl;
                find=1;
                break;
            }
            else h[a[i]%p]=1;
        }
        if(!find)puts("-1");
    }
    return 0;
}

/*
DESCRIPTION:

*/

B题 贪心

/*
ID: neverchanje
PROG:
LANG: C++11
*/
#include<vector>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<set>
#include<queue>
#include<map>
using namespace std;
#define INF 0Xfffffff
#define maxn
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int,int> vii;

char s[1001];
int k;
int h[27];

int main(){
//    freopen("a.txt","r",stdin);
//    freopen(".out","w",stdout);
    while(cin>>s){
        cin>>k;

        int m=-1;
        for(int i=0;i<26;i++){
            cin>>h[i];
            if(h[i]>m)    m=h[i];
        }

        ll ans=0;int l=strlen(s);
        for(int i=0;i<l;i++)
            ans+=h[s[i]-‘a‘]*(i+1);
        ans+=(l+1+l+k)*k*m/2;
        cout<<ans<<endl;
    }
    return 0;
}

/*
DESCRIPTION:

*/

C题 dp

/*
ID: neverchanje
PROG:
LANG: C++11
*/
#include<vector>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<set>
#include<queue>
#include<map>
using namespace std;
#define INF 0Xfffffff
#define maxn 100001
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int,int> vii;

int n,a[maxn],s[maxn],e[maxn];

int main(){
//    freopen("a.txt","r",stdin);
//    freopen(".out","w",stdout);
    while(cin>>n){
        for(int i=1;i<=n;i++)
            cin>>a[i];

        s[n]=1;
        for(int i=n-1;i>=1;i--)
            s[i] = (a[i]<a[i+1])? s[i+1]+1 : 1;

        e[1]=1;
        for(int i=2;i<=n;i++)
            e[i] = (a[i]>a[i-1])? e[i-1]+1 : 1;

        int ans = max( e[n-1]+1 , s[2]+1 );
        for(int i=2;i<=n-1;i++){
            if(a[i+1] - a[i-1]>1)
                ans = max( ans , e[i-1]+s[i+1]+1 );
            else
                ans = max(ans , max(s[i+1],e[i-1])+1 );
        }

    cout<<ans<<endl;
    }
    return 0;
}

/*
DESCRIPTION:
题还是做得太少,这题跟lis一点关系都没有
以i为开头的最长连续序列s[i],以i为结尾的最长连续序列e[i]
这题恶心,按理来说ai>0,但是数据允许你把ai改成0
*/

D题 优先队列

/*
ID: neverchanje
PROG:
LANG: C++11
*/
#include<vector>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<set>
#include<queue>
#include<map>
using namespace std;
#define INF 1e9
#define maxn
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define mset(x) memset(x,0,sizeof(x))
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int,int> vii;

int n,m,k,p;
int row[1001],col[1001];
ll sc[1000000],sr[1000000];

int main(){
//    freopen("a.txt","r",stdin);
//    freopen(".out","w",stdout);
    cin>>n>>m>>k>>p;
    mset(row);mset(col);

    int x;
    rep(i,0,n-1)
        rep(j,0,m-1){
            cin>>x;
            row[i]+=x;
            col[j]+=x;
        }

    priority_queue<int> c,r;
    rep(i,0,m-1)    c.push(col[i]);
    rep(i,0,n-1)    r.push(row[i]);

    sc[0]=0;sr[0]=0;
    rep(i,1,k){//把最大的k列存进c中
        int x=c.top() , y=r.top();
        sc[i] = sc[i-1]+x;    sr[i] = sr[i-1]+y;
        c.pop();    r.pop();
        c.push(x-n*p);    r.push(y-m*p);
    }

    ll ans = sr[k];
    rep(i,1,k){
        ans = max( ans, sc[i]+sr[k-i]-1ll*(k-i)*i*p );
    }
    cout<<ans<<endl;
    return 0;
}

/*
DESCRIPTION:
按照某种取法得到解,解与行列选择的顺序无关
取了i列,(k-i)行
ans = max( sigma(col) + sigma(row) - (k-i)*i*p )

将col和row分别用priority_queue储存
枚举i,意味着要把最大的k个列存进prq中
由于i列中可能会有重复的

算法就是:先在prq中找最大col, 把col-n*p存进去,如此循环k次
这样prq里有了最大的k个数
不过这样占用的内存过大
要及时删除

由于最大会有1e12的数,故注意要用long long
priority_queue.top()默认返回最大值
*/

Codeforces Round #FF(255) (Div. 2),布布扣,bubuko.com

时间: 2024-10-16 03:19:22

Codeforces Round #FF(255) (Div. 2)的相关文章

Codeforces Round #FF(255) C. DZY Loves Sequences (LIS升级)

题目:C. DZY Loves Sequences (LIS升级) 题意: 在n个数中,最多改变一个数字,并求能够达到的最长严格上升子序列(连续)长度 分析: 考虑第i个数,能否改变后拼接前后两个字串,并维护当前最大值 状态: left[i]:  表示以i为终点的最长严格上升子序列长度 right[i]: 表示以i为起点的最长严格上升子序列长度 dp[i]:   表示改变第i个数后,拼接前后字串的长度 转移方程:       dp[i] = max{left[i-1] + right[i+1] 

Codeforces Round #FF(255) DIV2 C - DZY Loves Sequences

A - DZY Loves Hash 水题,开辟一个数组即可 #include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; int main(){ int p,n; cin >> p >> n; vector<bool> buckets(302,false); bool flag = fal

Codeforces Round #FF/#255 D DZY Loves Modification --贪心+优先队列

题意:给你一个矩阵,每次选某一行或者某一列,得到的价值为那一行或列的和,然后该行每个元素减去p.问连续取k次能得到的最大总价值为多少. 解法: 如果p=0,即永远不减数,那么最优肯定是取每行或每列那个最大的取k次,所以最优解由此推出. 如果不管p,先拿,最后再减去那些行列交叉点,因为每个点的值只能取一次,而交叉点的值被加了两次,所以要减掉1次,如果取行A次,取列B次,那么最后答案为: res = dp1[A] + dp2[B] - B*(k-A)*p,可以细细体会一下后面那部分. 其中: dp1

Codeforces Round #FF (Div. 1)-A,B,C

A:DZY Loves Sequences 一开始看错题了..sad. 题目很简单,做法也很简单.DP一下就好了. dp[i][0]:到当前位置,没有任何数改变,得到的长度. dp[i][1]:到当前位置,改变了一个数,得到的长度 不过需要正向求一遍,然后反向求一遍. #include<iostream> #include<stdio.h> #include<algorithm> #include<stdlib.h> #include<string.h

DP Codeforces Round #FF (Div. 1) A. DZY Loves Sequences

题目传送门 /* DP:先用l,r数组记录前缀后缀上升长度,最大值会在三种情况中产生: 1. a[i-1] + 1 < a[i+1],可以改a[i],那么值为l[i-1] + r[i+1] + 1 2. l[i-1] + 1 3. r[i+1] + 1 //修改a[i] */ #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int MAXN =

Codeforces Round #FF (Div. 2) 题解

比赛链接:http://codeforces.com/contest/447 A. DZY Loves Hash time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output DZY has a hash table with p buckets, numbered from 0 to p?-?1. He wants to insert n 

Codeforces Round #277.5 (Div. 2) JAVA版题解

Codeforces Round #277.5 (Div. 2) A. SwapSort time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output In this problem your goal is to sort an array consisting of n integers in at most n swaps. For t

Codeforces Round #277.5 (Div. 2) b

/**  * @brief Codeforces Round #277.5 (Div. 2) b  * @file b.c  * @author 面码  * @created 2014/11/18 17:22  * @edited  2014/11/18 17:22  * @type greedy  *  */ #include <stdio.h> #define MAXN 110 #define max(a, b)  ((a) > (b) ? (a) : (b)) #define mi

Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) A. Single Wildcard Pattern Matching B. Pair of Toys C. Bracket Subsequence D. Array Restoration-区间查询最值(RMQ(ST))

Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) A. Single Wildcard Pattern Matching 题意就是匹配字符的题目,打比赛的时候没有看到只有一个" * ",然后就写挫了,被hack了,被hack的点就是判一下只有一个" * ". 1 //A 2 #include<iostream> 3 #include<cstdio&g