Codeforces Round #481 (Div. 3) ABCDEFG

Problem - A - Codeforces

input

6
1 5 5 1 6 1

output

3
5 6 1 

input

5
2 4 2 4 4

output

2
2 4 

input

5
6 6 6 6 6

output

1
6 

倒序输出

#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int n; cin>>n;
    int a[200200];
    for(int i=1;i<=n;i++) cin>>a[i];
    map<int,int> mp;
    vector<int> vi;
    for(int i=n;i>=1;i--)
    {
        mp[a[i]]++;
        if(mp[a[i]]==1) vi.push_back(a[i]);
    }
    cout<<vi.size()<<endl;
    for(int i=vi.size()-1;i>=0;i--)
        cout<<vi[i]<<" ";
        cout<<endl;
    return 0;
}

Problem - B - Codeforces

 input

6
xxxiii

output

1

input

5
xxoxx

output

0

input

10
xxxxxxxxxx

output

8
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    //int t; cin>>t;while(t--){
    int n; cin>>n;
    char s[200200];
    for(int i=1;i<=n;i++) cin>>s[i];
    if(strstr(s,"xxx")!=NULL) cout<<"0"<<endl;
    else
    {
        int sum=0;
        for(int i=3;i<=n;i++)
        {
            if(s[i-2]=='x'&&s[i-1]=='x'&&s[i]=='x') sum++;
        }
        cout<<sum<<endl;
    }
    return 0;
}

 似乎我的strstr没进去运行过???数据问题吧!

Problem - C - Codeforces

 input

3 6
10 15 12
1 9 12 23 26 37

output

1 1
1 9
2 2
2 13
3 1
3 12

input

2 3
5 10000000000
5 6 9999999999

output

1 5
2 1
2 9999999994

lower_bound直接找位置 

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
long long int a[200200]={0},b[200200],dp[200200]={0};
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    long long int n,m; cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        dp[i]=dp[i-1]+a[i];
    }
    for(int i=1;i<=m;i++)
        cin>>b[i];
    for(int i=1;i<=m;i++) //cout<<dp[i]<<" ";
    {
        long long int t=lower_bound(dp+1,dp+n+1,b[i])-dp;
        cout<<t<<" "<<b[i]-dp[t-1]<<endl;
    }
    return 0;
}

 Problem - D - Codeforces

input

4
24 21 14 10

output

3

input

2
500 500

output

0

input

3
14 5 1

output

-1

input

5
1 3 6 9 12

output

1

 自己没折腾出来,好失败,看了大佬的写法,慢慢摸出来。

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<map>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int n; cin>>n;
    int a[200200],b[200200];
    for(int i=0;i<n;i++)
        cin>>a[i];//这个题目如果用sort排序一下会wa17,我很疑惑
    int sum=0x3f3f3f3f;
    for(int i=-1;i<=1;i++)
    {//根据首两位推测出差
        for(int j=-1;j<=1;j++)
        {//-1-1, -10, -11,  0-1, 00, 01, 1-1, 10, 11
            b[0]=a[0]+i; b[1]=a[1]+j;
            int distance=b[1]-b[0];
            bool flag=true;
            int t=abs(i)+abs(j);
            for(int r=2;r<n;r++)
            {
                b[r]=b[r-1]+distance;
                if(abs(b[r]-a[r])>1) { flag=false; break; }
                else { if(b[r]!=a[r]) t++; }
            }
            if(flag==true) sum=min(sum,t);
        }
    }
    if(sum==0x3f3f3f3f) cout<<"-1"<<endl;
    else cout<<sum<<endl;
    return 0;
}

Problem - E - Codeforces

input

3 5
2 1 -3

output

3

input

2 4
-1 1

output

4

input

4 10
2 4 1 2

output

2

 找极值

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
int a[200200],sum=0;
int dp[200200]={0},minn=0,maxn=0;
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int n,w; cin>>n>>w;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        sum+=a[i];
    }
    for(int i=1;i<=n;i++)
    {
        dp[i]=dp[i-1]+a[i];
        minn=min(minn,dp[i]); maxn=max(maxn,dp[i]);
    } //cout<<maxn<<" "<<minn<<endl;
    if(abs(minn)>w||maxn>w||sum>w) cout<<"0"<<endl;
    else if(w-maxn+1-abs(minn)<0) cout<<"0"<<endl;
    else cout<<w-maxn+1-abs(minn)<<endl;
    return 0;
}

Problem - F - Codeforces

 input

4 2
10 4 10 15
1 2
4 3

output

0 0 1 2 

input

10 4
5 4 1 5 4 3 7 1 2 5
4 6
2 1
10 8
3 5

output

5 4 0 5 3 3 9 0 2 5 

注意特判负数的输出即可。 

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<map>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int n,k; cin>>n>>k;
    int a[200200],b[200200];
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        b[i]=a[i];
    }
    sort(b+1,b+1+n);
    map<int,int> mp;
    while(k--)
    {
        int x,y; cin>>x>>y;
        // 谁更大则说明谁要减少一个徒弟
        if(a[x]>a[y]) mp[x]++;
        else if(a[x]<a[y]) mp[y]++;
    }
    for(int i=1;i<=n;i++)
    {
        int t=lower_bound(b+1,b+1+n,a[i])-b;
        if(t-1-mp[i]<0) cout<<"0 ";
        else cout<<t-1-mp[i]<<" ";
    }
    cout<<endl;
    return 0;
}

Problem - G - Codeforces

 input

5 2
1 3 1
1 5 1

output

1 2 3 0 3 

input

3 2
1 3 1
1 2 1

output

-1

input

10 3
4 7 2
1 10 3
8 9 1

output

2 2 2 1 1 0 4 3 4 4 

 注意-1的类型的判断即可。给我整出来了,真不容易吖!

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<map>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[200200],s[200200],d[200200],c[200200],sum=0;
int f[200200];
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int n,m; cin>>n>>m;//n天 m场考试
    int ans=0;
    bool flag=true;
    for(int i=1;i<=m;i++)
    {
        cin>>s[i]>>d[i]>>c[i]; //第一场的报送时间 哪天考 要准备多少天
        if(d[i]-s[i]<c[i]) flag=false;
        a[i]=i;//序号
        f[d[i]]=m+1;//直接插入考试时间
        ans+=c[i];
    }
    for(int i=1;i<m;i++)
    {
        for(int j=i+1;j<=m;j++)
        {
            if(d[i]>d[j]) swap(d[i],d[j]),swap(s[i],s[j]),swap(c[i],c[j]),swap(a[i],a[j]);
        }
    }//按照考试先后时间顺序排列
    //for(int i=1;i<=m;i++) cout<<s[i]<<" "<<d[i]<<" "<<c[i]<<" "<<a[i]<<endl;
    for(int i=1;i<=m;i++)//有几场考试一场一场慢慢看
    {
        for(int j=s[i],sum=c[i];sum>0;j++)//复习时间安排
        {
            if(f[j]==0) f[j]=a[i],sum--;
            if(j>=d[i]) flag=false;
        }
    }
    int flagg=0;
    for(int i=1;i<=n;i++)
        if(f[i]!=0&&f[i]!=m+1) flagg++;
    //for(int i=1;i<=n;i++) cout<<f[i]<<" "; cout<<endl;
    //cout<<ans<<" "<<flagg<<endl;
    if(ans!=flagg||flag==false) cout<<"-1"<<endl;
    else
    {
        for(int i=1;i<=n;i++)
            cout<<f[i]<<" ";
        cout<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vijurria

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值