codeforces gym-101078

题目链接:

http://codeforces.com/gym/101078

 

A:

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <bits/stdc++.h>
#include <stack>
#include <map>
 
using namespace std;
 
#define For(i,j,n) for(int i=j;i<=n;i++)
#define mst(ss,b) memset(ss,b,sizeof(ss));
#define ll long long;
typedef  long long LL;
 
template<class T> void read(T&num) {
    char CH; bool F=false;
    for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
    for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
    F && (num=-num);
}
int stk[70], tp;
template<class T> inline void print(T p) {
    if(!p) { puts("0"); return; }
    while(p) stk[++ tp] = p%10, p/=10;
    while(tp) putchar(stk[tp--] + '0');
    putchar('\n');
}
 
const LL mod=1e9+7;
const double PI=acos(-1.0);
const LL inf=1e18;
const int N=1e6+2000;
const int maxn=1e5+5;
const double eps=1e-8;

int a[maxn],p[maxn];
int main()
{
    int t;
    read(t);
    while(t--)
    {
        int n;
        read(n);
        For(i,1,n)
        {
            read(a[i]);
            p[a[i]]=i;
        }
        int st=0,mmax=0,x;
        For(i,1,n)
        {
            read(x);
            mmax=max(mmax,p[x]);
            if(i==mmax)
            {
                printf("%d-%d ",st+1,i);
                st=i;
            }
        }
        printf("\n");
    } 
    return 0;
}

/*
题意:
给两个[1,n]的排列,现在要给分成几部分,每一部分里面都是数字相同,现在要怎么分;

思路:

水题啦啦;
*/

  

B:

 

C:

 

D:

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <bits/stdc++.h>
#include <stack>
#include <map>
 
using namespace std;
 
#define For(i,j,n) for(int i=j;i<=n;i++)
#define mst(ss,b) memset(ss,b,sizeof(ss));
#define ll long long;
typedef  long long LL;
 
template<class T> void read(T&num) {
    char CH; bool F=false;
    for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
    for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
    F && (num=-num);
}
int stk[70], tp;
template<class T> inline void print(T p) {
    if(!p) { puts("0"); return; }
    while(p) stk[++ tp] = p%10, p/=10;
    while(tp) putchar(stk[tp--] + '0');
    putchar('\n');
}
 
const LL mod=1e9+7;
const double PI=acos(-1.0);
const LL inf=1e18;
const int N=1e6+2000;
const int maxn=5e3+10;
const double eps=1e-8;

int main()
{
    int t;
    read(t);
    while(t--)
    {
        LL n;
        read(n);
        if(n==0){cout<<"0\n";continue;}
        LL ans=n-n/2;
        for(int i=1;i<=3;i++)
        {
            if((n+i-1)%3==0)
            {
                LL t=(n+i-1)/3;
                if(t%2==0)t++;
                ans=ans+(n-t)/2+1;
                break;
            }
        }
        print(ans);
    }    
    return 0;
}

/*
题意:
每个数m和2*m之间都有一根绳,每个奇数m和3*m+1之间有一根绳,现在要把[1,n]拿走,需要剪断多少根绳;

思路:

这个就是个水题,把2*m>n的减去,把3*m+1>n的剪去就是答案了;
*/

  

E:

 

F:

 

G:

 

H:

 

I:

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <bits/stdc++.h>
#include <stack>
#include <map>
 
using namespace std;
 
#define For(i,j,n) for(int i=j;i<=n;i++)
#define mst(ss,b) memset(ss,b,sizeof(ss));
#define ll long long;
typedef  long long LL;
 
template<class T> void read(T&num) {
    char CH; bool F=false;
    for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
    for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
    F && (num=-num);
}
int stk[70], tp;
template<class T> inline void print(T p) {
    if(!p) { puts("0"); return; }
    while(p) stk[++ tp] = p%10, p/=10;
    while(tp) putchar(stk[tp--] + '0');
    putchar('\n');
}
 
const LL mod=1e9+7;
const double PI=acos(-1.0);
const LL inf=1e18;
const int N=1e6+2000;
const int maxn=1e6+5;
const double eps=1e-8;

char s[maxn];
int p,sz;
struct node
{
    char ch;
    int l,r;
}po[N];
void movele()
{
    if(p==0)return ;
    p=po[p].l;
}
void moveri()
{
    if(po[p].r==0)return ;
    p=po[p].r;
}
void insert(char &t)
{
    sz++;
    po[sz].ch=t;
    po[sz].l=p;
    po[sz].r=po[p].r;
    po[p].r=sz;
    if(po[sz].r)po[po[sz].r].l=sz;
    p=sz;
}
void dele()
{
    if(p==0)return ;
    if(po[p].r)
    {
        int nex=po[p].r;
        int pre=po[p].l;
        po[nex].l=pre;
        po[pre].r=nex;
        p=pre;
    }
    else 
    {
        int pre=po[p].l;
        po[pre].r=0;
        p=pre;
    }
}
void out()
{
    p=po[0].r;
    while(p)
    {
        printf("%c",po[p].ch);
        p=po[p].r;
    }
    printf("\n");
}
int main()
{
    int t;
    read(t);
    while(t--)
    {
        gets(s);
        int len=strlen(s);
        sz=0;p=sz;
        po[0].l=0;po[0].r=0;
        for(int i=0;i<len;i++)
        {
            if(s[i]=='<')movele();
            else if(s[i]=='>')moveri();
            else if(s[i]=='-')dele();
            else insert(s[i]);
        }
        out();
    }
    return 0;
}

/*
题意:
模拟几项操作,最后输出密码,其中<表示光标左移一位,>表示右移一位,-表示删除一位,其他的字符就表示插入一个字符,
这些操作都是在可以操作的情况下才执行;

思路:

用一个双向链表模拟一下,我不太会写链表,就用结构体代替啦;
*/

  

J:

 

K:

 

L:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <bits/stdc++.h>
#include <stack>
#include <map>
 
using namespace std;
 
#define For(i,j,n) for(int i=j;i<=n;i++)
#define mst(ss,b) memset(ss,b,sizeof(ss));
#define ll long long;
typedef  long long LL;
 
template<class T> void read(T&num) {
    char CH; bool F=false;
    for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
    for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
    F && (num=-num);
}
int stk[70], tp;
template<class T> inline void print(T p) {
    if(!p) { puts("0"); return; }
    while(p) stk[++ tp] = p%10, p/=10;
    while(tp) putchar(stk[tp--] + '0');
    putchar('\n');
}
 
const LL mod=1e9+7;
const double PI=acos(-1.0);
const LL inf=1e18;
const int N=1e6+2000;
const int maxn=5e3+10;
const double eps=1e-8;

char s[maxn];
int main()
{
    scanf("%s",s);
    int len=strlen(s);
    double ans=0;
    for(int i=len-1;i>=0;i--)
    {
        if(s[i]=='0')
        {
            for(int j=0;j<=i;j++)
            {
                if(s[j]=='1')
                {
                    swap(s[i],s[j]);
                    ans=ans+sqrt(i-j);
                    break;
                }
            }
        }
    }
    printf("%.12lf\n",ans);
    return 0;
}

/*
题意:
给出一个01串,让把0都换到前边来,每次交换位置i和j的花费为sqrt(i-j);问最小的花费是多少;

思路:
假设现在位置i<j<x<y,i,j为1,x,y为1,sqrt(x-j)+sqrt(y-i)<sqrt(x-i)+sqrt(y-j),
这个大小关系可以通过平方啊比较出来,然后就是最外面的10一块交换花费最小,所以就这样贪心就好;
*/

  

  

转载于:https://www.cnblogs.com/zhangchengc919/p/5853657.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值