2020/7/30

这篇具有很好参考价值的文章主要介绍了2020/7/30。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Educational Codeforces Round 143 (Rated for Div. 2)\C_Tea_Tasting.cpp

//题意:有n种茶,n个人,第i种茶有 a[i]的量,第i个人一次能喝 b[i], 第i个人从第i种茶开始往前喝,求每个人最多能喝多少茶。

//思路:纯模拟时间超限,对于a数组中的每个元素,他要减的是包括i在内以及其右边的b数组中的元素,

//那么需要先求出b数组的前缀和数组sum,那么对于任意的ai,我们可以找到它从i向右减b中元素后第一次减成0的位置

//也就是在前缀和数组中从i向右的位置二分查找第一个sum[j]-sum[i-1]>ai的位置j,从i到j-1的每一个b中元素都是使ai减去一个完整的自己的,

//bj使ai减剩下的数减到了0,用差分数组cnt记录b中每个元素使a中元素减去了几个完整的自己也就是对于每次二分查找,都有cnt[i]++,cnt[j]--,

//然后用另一个数组ex记录b中每个数使a中某个数减到零所提供的贡献,n次二分查找结束后,对差分数组求前缀和,答案数组就等于cnt[i]*b[i]+ex[i]

#include<bits/stdc++.h>

#include<iostream>

#include<algorithm>

#include<map>

#include<set>

#include<queue>

#include<cstring>

#include<math.h>

#include<map>

#include<vector>

#include<stack>

using namespace std;



#define endl '\n'

typedef pair<int,int> pr;



#define int long long

#define ll long long

#define fr(i,l,r) for(int i=l;i<=r;i++)

#define ufr(i,n,z) for(int i = n;i >= z; i--)

#define pb(x) push_back(x)

#define all(a) a.begin(),a.end()

#define fi first

#define se second



const int N = 1e6+10;

const int mod=998244353,inf=LONG_LONG_MAX;

int n,m;



int a[N];

int b[N];

int sum[N];

int ex[N];

void solve(){

    /* cin>>n;

    fr(i,1,n){

        cin>>a[i];

        c[i]=0;

    }

    fr(i,1,n){

        cin>>b[i];

    }

    fr(i,1,n){

        ufr(j,i,1){

            c[i]+=min(a[j],b[i]);

           if(b[i]>=a[j]){

               a[j]=0;

           }

           else{

              a[j]-=b[i];

           }

        }

    }

    fr(i,1,n){

        cout<<c[i]<<' ';

    }

    cout<<'\n'; */

    int n;

    cin>>n;

    fr(i,1,n){

        cin>>a[i];

        sum[i]=0;

        ex[i]=0;

    }

    fr(i,1,n){

        int x;

        cin>>x;

        b[i]=b[i-1]+x;

    }

    fr(i,1,n){

        int it=upper_bound(b+1,b+1+n,b[i-1]+a[i])-b;         //后面的a不用减前面的b,整体基础上+b[i-1]

        //cout<<it<<' ';

        sum[i]++;

        sum[it]--;

        ex[it]+=a[i]-(b[it-1]-b[i-1]);

    }

    //cout<<'\n';

    fr(i,1,n){

        sum[i]+=sum[i-1];

    }

    fr(i,1,n){

        cout<<sum[i]*(b[i]-b[i-1])+ex[i]<<' ';

    }

    cout<<'\n';



}



signed main()

{

    int t=1;

    cin>>t;

    while(t--) solve();

    return 0;

}

Codeforces Round 887 (Div. 2)\C_Ntarsis_Set.cpp

//题意:n个数,每次按照顺序删除位于a[i]位置的这n个数,问k次后最小的是多少

//思路:如果没有1,则最小为1,有1通过列举情况可以发现对于某一个删除位,前面有几个删除位,后面就要跳几次删,

//于是发现这是一个公差为1,2,3...不断变化的n个数列,第i个数列截止与a[i+1],为了防止没有k个数,于是增加一个公差为n+1,截止于1e18的数列

#include<bits/stdc++.h>

#include<iostream>

#include<algorithm>

#include<map>

#include<set>

#include<queue>

#include<cstring>

#include<math.h>

#include<map>

#include<vector>

#include<stack>

using namespace std;



#define endl '\n'

typedef pair<int,int> pr;



#define int long long

#define ll long long

#define fr(i,l,r) for(int i=l;i<=r;i++)

#define ufr(i,n,z) for(int i = n;i >= z; i--)

#define pb(x) push_back(x)

#define all(a) a.begin(),a.end()

#define fi first

#define se second



const int N = 1e6+10;

const int mod=998244353,inf=LONG_LONG_MAX;



int a[N];



void solve()

{

    int n,k;

    cin>>n>>k;

    fr(i,1,n){

        cin>>a[i];

    }

    if(a[1]!=1){

        cout<<1<<'\n';

        return;

    }

    a[n+1]=inf;                //保证一定有k个数

    vector<int>v;

    int cnt=1;

    int d=1;

    fr(i,2,n+1){

        while(cnt+d<a[i]){

            cnt+=d;

             v.push_back(cnt);

            if(v.size()>k+1){

                break;

            }

        }

        if(v.size()>k+1){

            break;

        }

        d=i;

    }

    cout<<v[k-1]<<'\n';

}



signed main()

{

    int t=1;

    cin>>t;

    while(t--) solve();

    return 0;

}

\Codeforces Round 842 (Div. 2)\C_Elemental_Decompress.cpp

//题意:给定一个长度为n的排列a,请构造两个数组 p,q,要求 max(pi,qi)=ai,并且两个数组都是排列,请输出两个数组。

//思路:1.对于出现三次及以上的NO,对于出现两次的一定有没出现出现的与之对应,否则NO

//2.将出现两次的与没出现的对应,没出现的记录,在记录寻找首次小于出现两次的对应,下一次再出现颠倒位置,文章来源地址https://www.toymoban.com/news/detail-616981.html

#include<bits/stdc++.h>

#include<iostream>

#include<algorithm>

#include<map>

#include<set>

#include<queue>

#include<cstring>

#include<math.h>

#include<map>

#include<vector>

#include<stack>

using namespace std;



#define endl '\n'

typedef pair<int,int> pr;



#define int long long

#define ll long long

#define fr(i,l,r) for(int i=l;i<=r;i++)

#define ufr(i,n,z) for(int i = n;i >= z; i--)

#define pb(x) push_back(x)

#define all(a) a.begin(),a.end()

#define fi first

#define se second



const int N = 1e6+10;

const int mod=998244353,inf=LONG_LONG_MAX;

int n,m;



int a[N];

int ans1[N];

int ans2[N];

 void solve(){

     cin >> n;

     for (int i = 1; i <= n; i++ ) cin >> a[i];

     map<int, int> mp, st;

     for (int i = 1; i <= n; i++ ) {

         mp[a[i]]++ ;

         if(mp[a[i]] > 2){

            cout<<"NO"<<'\n';

            return ;

         }

     }



     int cur = 0;

     vector<int> v;

     for (int i = 1; i <= n; i++ ) {

         cur += mp[i];

         if(!mp[i]) v.push_back(i);

         if(cur > i){

            cout<<"NO"<<'\n';

            return;

         }

     }

     

     cout << "YES" << endl;

     

     for (int i = 1; i <= n; i++ ) {

         if(mp[a[i]] == 1) {

             ans1[i] = a[i];

             ans2[i] = a[i];

             continue;

         }

         if(!st[a[i]]) {

             auto it = lower_bound(v.begin(), v.end(), a[i]);

             if(it == v.begin()) {                 //没有小的

                cout<<"NO"<<'\n';

                return ;

             }

             it-- ;

             ans1[i] = *it;

             st[a[i]] = ans1[i];

             ans2[i] = a[i];

             v.erase(it);                      //还要删除防止重复

         } else {

             ans1[i] = a[i];

             ans2[i] = st[a[i]];

         }

         

     }

     for (int i = 1; i <= n; i++ )

      cout << ans1[i] << " \n"[i == n];

     for (int i = 1; i <= n; i++ )

     cout << ans2[i] << " \n"[i == n];

 }



signed main()

{

    int t=1;

   cin>>t;

    while(t--) solve();

    return 0;

}

到了这里,关于2020/7/30的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法基础(二)(共有30道例题)

    (一)数组 定义:数组是存放在连续内存空间上的相同类型数据的集合。数组可以方便的通过下标索引的方式获取到下标下对应的数据。 注意: (1)数组下标都是从0开始的。 (2)数组内存空间的地址是连续的。正是因为数组的在内存空间的地址是连续的,所以我们在删除

    2024年02月01日
    浏览(41)
  • 考研算法30天:堆排序 【堆排序】

    原先自己写过这道题的题解,但是当时水平有限所以这次重写一次。 (1条消息) 堆的创建(题目:堆排序)_空が笑っています的博客-CSDN博客 算法介绍 我在上陈越姥姥的课程之后我学会了如何用数组表示一个堆(堆其实就是根节点大于或者小于它的子节点的完全二叉树)然后陈

    2024年02月11日
    浏览(31)
  • Day30- 贪心算法part04

    题目一:860. 柠檬水找零  860. 柠檬水找零 在柠檬水摊上,每一杯柠檬水的售价为  5  美元。顾客排队购买你的产品,(按账单  bills  支付的顺序)一次购买一杯。 每位顾客只买一杯柠檬水,然后向你付  5  美元、 10  美元或  20  美元。你必须给每个顾客正确找零,也就

    2024年01月19日
    浏览(42)
  • 【LeetCode算法系列题解】第26~30题

    【题目描述】 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以

    2024年02月10日
    浏览(41)
  • (转载)MATLAB智能算法30个案例分析(1)——遗传算法工具箱

            以下内容大部分来源于《MATLAB智能算法30个案例分析》,仅为学习交流所用。         遗传算法(genetic algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的“物竞天择、适者生存”的演化法则。遗传算法是把问题参数编码为染色体,再利用迭代的方式进行选

    2024年02月05日
    浏览(64)
  • Matlab实现遗传算法(附上30个完整仿真源码)

    遗传算法(Genetic Algorithm,GA)是一种基于生物进化理论的优化算法,通过模拟自然界中的遗传过程,来寻找最优解。 在遗传算法中,每个解被称为个体,每个个体由一组基因表示,每个基因是解空间中的一个变量。算法通过不断地交叉、变异、选择等操作,来寻找最优解。

    2024年02月13日
    浏览(50)
  • 算法练习Day30 (Leetcode/Python-动态规划)

    62. Unique Paths There is a robot on an  m x n  grid. The robot is initially located at the  top-left corner  (i.e.,  grid[0][0] ). The robot tries to move to the  bottom-right corner  (i.e.,  grid[m - 1][n - 1] ). The robot can only move either down or right at any point in time. Given the two integers  m  and  n , return  the number of possible

    2024年01月20日
    浏览(43)
  • 【算法|动态规划No30】leetcode5. 最长回文子串

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成长,共同进步。

    2024年02月08日
    浏览(41)
  • 算法leetcode|30. 串联所有单词的子串(rust重拳出击)

    给定一个字符串 s 和一个字符串数组 words 。 words 中所有字符串 长度相同 。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如,如果 words = [\\\"ab\\\",\\\"cd\\\",\\\"ef\\\"] , 那么 \\\"abcdef\\\" , \\\"abefcd\\\" , \\\"cdabef\\\" , \\\"cdefab\\\" , \\\"efabcd\\\" , 和 \\\"efcdab\\\" 都是串联子串。

    2023年04月08日
    浏览(51)
  • 算法刷题Day 30 重新安排行程+N皇后+解数独

    想了很久,最后还是放弃了 这道题目有几个难点: 一个行程中,如果航班处理不好容易变成一个圈,成为死循环 有多种解法,字母序靠前排在前面,让很多同学望而退步,如何该记录映射关系呢 ? 使用回溯法(也可以说深搜) 的话,那么终止条件是什么呢? 搜索的过程中

    2024年02月12日
    浏览(75)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包