首页 > 其他 > 详细

HZNU 2019 Summer training 1

时间:2019-07-06 23:19:18      阅读:169      评论:0      收藏:0      [点我收藏+]

A - Alex and a Rhombus  

CodeForces - 1180A 

水:

技术分享图片
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string.h>
#include<math.h>
using namespace std;
#define ll long long

const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int maxn = 1e5 + 10;

void chongfu(){
    
}
int main()
{
    ll n;
    scanf("%lld",&n);

    ll tmp = 2 * n - 1;
    printf("%lld\n",tmp + (tmp - 1) * (tmp - 1) / 2);

}
View Code

 

B - Nick and Array    

CodeForces - 1180B 

题意:给一个长度为n的数列,对于数列中的每一个数ai都可以选择把它变为-ai-1,求所构成的最大乘积

题解:对于绝对值来说的话,正数变负数的绝对值会变大,负数变正数的绝对值会变小,所以要尽可能的把数字都调为负数,但如果有奇数个数的话,要保留一个正数确保积为正

技术分享图片
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string.h>
#include<math.h>
using namespace std;
#define ll long long

const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int maxn = 1e5 + 10;

int a[maxn];
int main()
{
    int n;
    int ling = 0;
    scanf("%d",&n);
    int zero = 0;
    int maxx = -INF;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        if(a[i] == 0)
            zero ++;
        int tmp;
        if(a[i] < 0)
            tmp = -1 * a[i] - 1;
        else
            tmp = a[i];
        if(tmp > maxx)
            maxx = tmp;
    }

    if(n % 2 == 1 and zero == n)
    {
        for(int i=0;i<n;i++)
            printf("%d ",a[i]);
    }
    else if(n % 2 == 0)
    {
        for(int i=0;i<n;i++)
            printf("%d ",a[i] >= 0 ? -1 * a[i] - 1 : a[i]);
    }
    else if(n % 2 == 1)
    {
        for(int i=0;i<n;i++)
        {
            int tmp = a[i] > 0 ? a[i] : -1 * a[i] - 1;

            if(tmp == maxx) {
                printf("%d ", tmp);
                maxx = INF;
            }
            else
                printf("%d ",a[i] >= 0 ? -1 * a[i] - 1 : a[i]);
        }
    }

}
View Code

 

C - Valeriy and Deque

CodeForces - 1180C 

题意:n个数放双端队列里面,有一个操作:取出前两个数,大的数放前面,小的或者一样大的放后面,问你经过m次操作后的前两个数是什么。
题解:使用deque进行模拟,当地一个数字是最大值的时候可以发现,之后的每次都会把第二个放在队尾,然后n - 1次循环。可以预先处理所有的出现的情况,之后输出
技术分享图片
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string.h>
#include<math.h>
#include<queue>
#include<deque>
using namespace std;
#define ll long long

const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int maxn = 1e5 + 10;

int a[maxn];
int n,q;
deque<int>que;

vector<pair<int,int>> v1;
vector<pair<int,int>> v2;
int main()
{
    scanf("%d %d",&n,&q);
    int maxx = -INF;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        que.push_back(a[i]);
        maxx = max(maxx,a[i]);
    }
    while(que[0] != maxx)
    {
        int tmp1 = que[0];
        int tmp2 = que[1];
        que.pop_front();
        que.pop_front();
        if(tmp1 < tmp2)
        {
            que.push_front(tmp2);
            que.push_back(tmp1);
        }
        else
        {
            que.push_back(tmp2);
            que.push_front(tmp1);
        }
        v1.push_back({tmp1,tmp2});
    }
    int len1 = v1.size();
    n--;
    int len2 = n;
    while(n--)
    {
        int tmp1 = que[0];
        int tmp2 = que[1];
        que.pop_front();
        que.pop_front();
        if(tmp1 < tmp2)
        {
            que.push_front(tmp2);
            que.push_back(tmp1);
        }
        else
        {
            que.push_back(tmp2);
            que.push_front(tmp1);
        }
        v2.push_back({tmp1,tmp2});
    }


    while(q--)
    {
        ll m;
        scanf("%lld",&m);
        if(m <= len1)
        {
            printf("%d %d\n",v1[m-1].first,v1[m-1].second);
        }
        else
        {
            m -= len1;
            m %= len2;
            if(m == 0)
                printf("%d %d\n",v2[len2-1].first,v2[len2-1].second);
            else
                printf("%d %d\n",v2[m-1].first,v2[m-1].second);
        }
    }
}
View Code

 

D - Tolik and His Uncle

 CodeForces - 1180D 

题意:n * m的网格中,起点为(1,1),每次寻找一个dx,dy,然后从当前的(x,y)跳到(x + dx, y + dy),保证每次的dx和dy不与之前的相等。要求跳完所有的格子,求跳的顺序

题解:反复从头到尾跳,再从尾到头跳 (1,1)(n,m)(1,2)(n,m1)

技术分享图片
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string.h>
#include<math.h>
#include<queue>
#include<deque>
using namespace std;
#define ll long long

const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int maxn = 1e5 + 10;

vector<pair<int,int>>v;
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++) {
        for (int j = 1; j <= m; j++) {
            v.push_back({i, j});
        }
    }
    int i=0,j = v.size()-1;
    int tot = 0;
    while(true)
    {
        printf("%d %d\n",v[i].first,v[i].second);
        tot++;
        i++;
        if(tot == n * m)
            break;
        printf("%d %d\n",v[j].first,v[j].second);
        tot++;
        j--;
        if(tot == n * m)
            break;
    }
}
View Code

 

E - Serge and Dining Room

 CodeForces - 1180E

题意:给出a 和 b 数组,a为各种食物的价格,b为一列排着队的小朋友拥有的钱,小朋友排队购买食物,每个人都买自己能买的起的最贵的食物,买不起就离开队伍。给出q次操作,操作1是修改食物的价格,操作2是修改小朋友的钱,每次操作后询问当小朋友买完之后,能买到的最贵的食物的价格是多少,没有食物了就输出-1.

HZNU 2019 Summer training 1

原文:https://www.cnblogs.com/smallhester/p/11144359.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!