解题记录
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<bits/stdc++.h>
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<bits/stdc++.h>
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;
}
}