Codeforces Round #553 (Div. 2) ABCD

传送门

A

题意:给你一个字符串,问你转化成一个包含 “ACTG” 的串 最少需要多少次  z的前一个是y 后一个是z

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#define maxn 100050
using namespace std;
int main()
{
	int t;
	cin>>t;
	string s;
	cin>>s;
	int minn=maxn;
	for(int i=0;i<=t-4;i++)
	{
		int ans=min(26-abs(s[i]-'A'),abs(s[i]-'A'))+min(26-abs(s[i+1]-'C'),abs(s[i+1]-'C'))+min(26-abs(s[i+2]-'T'),abs(s[i+2]-'T'))+min(abs(s[i+3]-'G'),26-abs(s[i+3]-'G'));
		minn=min(ans,minn);
	}
	cout<<minn<<endl;
}

B

题意:给你n行m列的矩阵 每一行取一个数字 进行 异或^ 看是否存在最后的值能够大于0

#include <bits/stdc++.h>
using namespace std;
int main() {
	int arr[510][510];
	int n,m;
	cin>>n>>m;
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>arr[i][j];
		}
		ans^=arr[i][1];
	}
	if(ans!=0)
	{
		cout<<"TAK"<<endl;
		for(int i=1;i<=n;i++)
		{
			cout<<1<<" ";
		}
		return 0;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=2;j<=m;j++)
		{
			if(arr[i][j]!=arr[i][1])
			{
				cout<<"TAK"<<endl;
				for(int k=1;k<=n;k++)
				{
					if(i==k)
					{
						cout<<j<<" ";
					}
					else
					{
						cout<<1<<" ";
					}
				}
			cout<<endl;
			return 0;
			}
		}
	}
	cout<<"NIE"<<endl;
	return 0;
}

C

题意:给你两个数组,一个只有奇数(1,3,5……),一个只有偶数(2,4,6……),让你合并为一个数组(第一次从奇数组拿一个过来即为1;第二次从偶数组拿两个数进来即为2,4;第三次从奇数组拿四个数进来,即为3,5,7,9,类似后推。)给你 l到r 区间问你他们的总和是多少 结果对1e9+7取模 (找规律)

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=1e9+7;
ll find(ll x)
{
	ll a[5]={0,0};
	ll c=1,flag=1;//1 为奇数 0为偶数 
	while(x)
	{
		a[flag]+=min(x,c);
		x-=min(x,c);
		flag^=1;
		c<<=1;
	}
        // 这是一个规律
        //奇数 1 3 5 7    4*4
        //偶数 2 4 6 8    4*5
	ll sum=((a[1]%mod)*(a[1]%mod))%mod;// 奇数和 
	sum+=((a[0]%mod)*((a[0]+1)%mod))%mod;// 偶数和 
	return sum%mod;
}
int main() {
	ll l,r;
	cin>>l>>r;
	cout<<(find(r)-find(l-1)+mod)%mod<<endl;
	return 0;
}

D

题意:给你n组数 将其排序 使a⋅(j−1)+b⋅(n−j) j为当前位置 总和最小

将 a⋅(j−1)+b⋅(n−j) 化简  (a-b)*j-a+b*n 可将这个式子看成的为j的函数 只需将a-b从大到小排序即可

#include <bits/stdc++.h>
#define ll long long
using namespace std;
struct node{
	ll a,b;
}r[100010];
ll cmp(node x,node y)
{
	return (x.a-x.b)>(y.a-y.b);
}
int main()
{
	ll n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>r[i].a>>r[i].b;
	}
	sort(r+1,r+1+n,cmp);
	ll ans=0;
	for(int i=1;i<=n;i++)
	{
		//cout<<r[i].a-r[i].b<<endl;
		ans+=(r[i].a-r[i].b)*i-r[i].a+r[i].b*n;
	}
	cout<<ans<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/henucm/article/details/89605014