Codeforces Round #830解题记录

解题记录

文章目录

  • Codeforces Round #830 (Div. 2)
  • A
  • B
  • C
  • D
  • E


Codeforces Round #830 (Div. 2)

使用C++语言解题,可能存在不简洁的地方。
陆续补


A

The cost of such an operation is n−i+1.(n为长度,i为下标)花费就是倒数第几个数,那么最小花费是选最后一个的花费为1,同时可以观察到gcd( n , n-1) = 1,即操作最后两个一定能达成目标,那么operation<=3,用gcd1来记录数组的公因数,
if gcd( gcd1 , n) ==1 operation = 1
else if gcd( gcd1 , n-1) == 1 operation = 2
else operation = 3

#include
using namespace std;
typedef long long ll;
int main()
{
	int tc;cin>>tc;while(tc--)
	{
		ll num;cin>>num;
		ll a[25];
		ll gcd1;               //用于记录数组的最大公因数 
		for(int i = 1;i<=num;i++)
		{
			cin>>a[i];
			if(i==1) gcd1 = a[1];
			else gcd1 = __gcd(a[i],gcd1);
		}
		if(gcd1==1) {         //如果公因数已经是一了直接输出 
			cout<<"0"<<endl;
			continue;
		}
		
		if(__gcd(gcd1,num)==1) cout<<1<<endl;
		else if(__gcd(gcd1,num-1)==1)  cout<<2<<endl;
		else cout<<3<<endl;
	}
	
} 

B

根据Tutorial 写的,

想象一个长度为n-1的数组a,当si 和 si+1相等为0,不等为1,要出现不减的情况,那么要么数组a全为0,或者只出现一个1,现在需要通过调整来减少1的个数,可以发现调整下标为i(在s字符串中)的,在a数组里只有a i-1 的数值发生了变化,那么就调整数值为1的来减少1的个数

用cnt记录相邻(si 和 si+1)不同的情况,
如果字符串是1开头那么输出cnt,如果字符串是0开头输出max(cnt-1,0),因为字符串全为0那么会导致出现-1的情况。

#include
using namespace std;
typedef long long ll;
int main()
{
	ll tc;cin>>tc;while(tc--)
	{
		string s;
		int len;
		cin>>len;
		cin>>s;
		if(s.size()==1){
			cout<<0<<endl;
			continue;
		}
		int cnt = 0;
		for(int i = 0;i<s.size()-1;i++)
		{
			if(s[i]!=s[i+1]) cnt++;
		}
		if(s[0]=='1') cout<<cnt<<endl;
		else cout<<max(cnt-1,0)<<endl;
	}
} 

C

D

E

你可能感兴趣的:(c++,开发语言)