Good Bye 2020 ABCD

Problem - A - Codeforces

题目大意:以(0,1)为顶点,给定的n个数凑底,问不同非0的面积数量。(不可重合)

input

8
4
1 2 4 5
3
1 3 5
3
2 6 8
2
1 2
1
50
5
3 4 5 6 8
3
1 25 26
6
1 2 4 8 16 32
output

4
2
3
1
0
5
3
15 

给定的范围很小,直接搜即可。 

#include<iostream>
#include<cmath>
#include<map>
#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;
        int a[100100];
        for(int i=1;i<=n;i++) cin>>a[i];
        map<int,int> mp;
        for(int i=1;i<n;i++)
            for(int j=i+1;j<=n;j++)
            mp[abs(a[i]-a[j])]++;
        int sum=0;
        for(int i=1;i<=51;i++)
            if(mp[i]!=0) sum++;
        cout<<sum<<endl;
    }
    return 0;
}

Problem - B - Codeforces

题目大意:给定n个正整数,可对任意正整数进行+1操作,求最大可获得的不同整数数量。

input

5
6
1 2 2 2 5 6
2
4 4
6
1 1 3 4 4 5
1
1
6
1 1 1 2 2 2

output

5
2
6
1
3

在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。 

#include<iostream>
#include<cmath>
#include<set>
#include<algorithm>
#include<map>
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;
        int a[200200];
        for(int i=1;i<=n;i++)
            cin>>a[i];
        set<int> s;
        for(int i=1;i<n;i++)
        {
            if(a[i-1]==a[i]&&a[i]!=a[i+1]) a[i]+=1,s.insert(a[i]);
            else s.insert(a[i]);
        }
        s.insert(a[n]+1);
        cout<<s.size()<<endl;
    }
    return 0;
}

Problem - C - Codeforces

题目大意:把一个字符串最少进行几次修改变成一个非回文字符串?

input

7
babba
abaac
codeforces
zeroorez
abcdcba
bbbbbbb
a

output

1
1
0
1
1
4
0

直接瓦解长度为2以及长度为3的回文串即可。 

#include<iostream>
#include<cmath>
#include<set>
#include<algorithm>
#include<map>
#include<cstring>
#include<cstdlib>
#include<string>
using namespace std;
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int t; cin>>t;
    while(t--)
    {
        string s; cin>>s;
        int sum=0;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]=='?') continue;
            if(s[i]==s[i+1]) s[i+1]='?',sum++;
            if(s[i]==s[i+2]&&i+2<s.size()) s[i+2]='?',sum++;
        }
        cout<<sum<<endl;
    }
    return 0;
}

Problem - D - Codeforces

题目大意:给定n个点的树,每个点有边权。现在有k种颜料,把每条边染色,可以不用全部颜料。对于颜色i,定义颜色i的权值为:删去所有颜色不为i的边之后,图中的每个点数>1的连通块点权和的最大值。定义图的权值为k种颜色的权值和。问对于k=[1,n],图中的最大权值是多少?

input

4
4
3 5 4 6
2 1
3 1
4 3
2
21 32
2 1
6
20 13 17 13 13 11
2 1
3 1
4 1
5 1
6 1
4
10 6 6 6
1 2
2 3
4 1

output

18 22 25
53
87 107 127 147 167
28 38 44

真心不喜欢树的题目 ,唔

 出度统计,即一个节点最多被使用的次数等于他的出度(就是与它相连的节点个数),在可以选择的节点中,优先选择权值最大的节点。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdlib>
#include<string>
#include<map>
using namespace std;
long long int a[200200],b[200200];
int f[100010];
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
	int t; cin>>t;
	while(t--)
	{
		int n; cin>>n;
		long long int sum=0;
		for(int i=1;i<=n;i++)
        {
             cin>>a[i];
             sum+=a[i];
        }
        int idx=0;//下标
		for(int i=1;i<n;i++)
        {
            int u,v; cin>>u>>v;
            f[u]++,f[v]++;
        }
		for(int i=1;i<=n;i++)
        {
            f[i]--;
            while(f[i]>0)
            {
                b[++idx]=a[i];
                f[i]--;
            }
        }
		sort(b+1,b+idx+1);
        cout<<sum<<" ";
		for(int i=idx;i>=1;i--)
		{
			sum+=b[i];
			cout<<sum<<" ";
		}
		cout<<endl;
	}
	return 0;
}

多看书多刷题,少吃零食多睡觉 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Vijurria

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

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

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

打赏作者

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

抵扣说明:

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

余额充值