题意: Bob提出了字符串a=“abac”,那么字符串a中所有长度为2的子字符串都是:“ab”, “ba”, “ac”。因此,字符串b=“abbaac”。给你一个字符串b,求a。
题解: a[0]=b[0],a[1]=b[1],然后以2为长度,使a[j++]=b[i+1],即每次得到b数组后2长度的最后一个字符。
#include
#define ll long long
#define maxn 2010
#define frj(i,n,k) for(long long i=2;i<=n-k;i++)
#define mc(i,q,k) modC(i,q,k)
using namespace std;
ll n,k,t,m,x,i,sum,l,r;
char a[105],b[105];
int main()
{
cin>>t;
while(t--){
cin>>b;
n=strlen(b);
if(n==2) cout<<b<<endl;
else {
a[0]=b[0];a[1]=b[1];
ll j=2;
for(i=2;i<n-1;i+=2){
a[j++]=b[i+1];
}
for(i=0;i<j;i++)
cout<<a[i];
cout<<endl;
}
}
return 0;
}
题意: 给定一个长度为N的数组,数组下标从0开始,为了使数组元素奇偶性与下标奇偶性相同,请给出数组元素移动的次数。
题解: 判断数组元素奇数偶数个数并记录,相等则可以交换得到符合条件的数组,否则输出-1.
#include
#include
#include
#include
#include
#include
#define ll long long
#define PI 3.141592653589
using namespace std;
ll n,i,j,m1,m2,x,ii,jj;
ll a[45];
int main()
{
int t;
cin>>t;
while(t--){
cin>>n;
m2=0;m1=0;
for(i=0;i<n;i++){
cin>>a[i];
if(i%2==0&&a[i]%2==1) m1++;
else if(i%2==1&&a[i]%2==0) m2++;
}
if(m1==m2) cout<<m1<<endl;
else cout<<"-1"<<endl;
}
return 0;
}
题意: 一个长度为N且为01的字符串,1代表有人占位,反之亦然,人与人之间最少间隔K个单位,求改变0为1且满足规则的最大改变次数。
题解: 记录0和1的个数,判断相距k+1时是否满足条件,满足则sum++,特判i=n-1时得情况。
#include
using namespace std;
typedef long long int lli;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
string s;
cin>>s;
int sum=0,count1=0,count0=0;
for(int i=0;i<n;i++)
{
if(s[i]=='1')
{
count1++;
if(count1==1)
sum+=(count0)/(k+1);
else
{
sum+=(count0-k)/(k+1);
count1=1;
}
count0=0;
}
if(s[i]=='0')
count0++;
if(i==n-1&&s[i]=='0'&&count1!=0)
{
sum+=(count0)/(k+1);
}
}
if(count1==0)
sum+=(count0+k)/(k+1);
cout<<sum<<endl;
}
return 0;
}
题意: 给定一个字符串,一个整数数组,列如t=“abzb”,由于t1=‘a’,所有其他索引都包含字母表中后面的字母,即b1=|1-2|+|1-3|+|1-4|=1+2+3=6;因为t2=‘b’,所以只有索引j=3包含字母表中后面的字母,即b2=|2-3|=1;由于t3=‘z’,则没有指标j使得tj>ti,则b3=0;因为t4=‘b’,所以只有索引j=3包含字母表后面的字母,即:b4=|4-3|=1。因此,t = “abzb”,则b=[6,1,0,1]。 以此构造一个t数组的子数组来满足b[]的条件。
题解: 上代码吧。。
#include
#define ll long long
using namespace std;
const int maxn = 2e6+9;
using namespace std;
char s[70],dict[70];
int a[70], idx[70], cnt[70];
int table[30];
void ini(){
memset(table, 0, sizeof(table));
for(int i = 0; s[i]; ++i)
++table[ s[i] - 'a' ];
}
int main(){
int t, n;
cin >> t;
while(t--){
cin>>s;
ini();
cin>>n;
memset(cnt, 0, sizeof(cnt));
for(int i = 0; i< n; ++i){
cin>>a[i];
idx[i] = -1;
cnt[i] = 0;
}
int round = 0;
int remain = n;
while(remain > 0){
++round;
for(int i = 0; i < n; ++i){
if(idx[i] == -1 && a[i] == 0){
idx[i] = round;
--remain;
}
}
for(int i = 0; i < n; ++i)
if(idx[i] == round){
for(int j = 0; j < n; ++j)
if(idx[j] == -1)
a[j] -= abs(i-j);
}
}
for(int i = 0; i < n; ++i)
++cnt[ idx[i] ];
int ptr = 1;
for(int i = 0; i < 26 && ptr <= round; ++i){
if( table[25 - i] >= cnt[ptr])
dict[ptr++] = 'a' + 25 - i;
}
for(int i = 0; i < n; ++i)
cout<<dict[ idx[i] ];
cout<<endl;
}
return 0;
}
题意: 给定一个长度为N的字符串,判断其能否组成K个珠顺时针旋转不变的项链,输出能组成这个K的最大字符长度。
题解: 记录字符,判断是否满足条件,求max值。
#include
using namespace std;
#define con continue
#define bk break
#define ms(a, b) memset((a), (b), sizeof(a))
#define mp make_pair
#define sz size()
#define len(X) strlen(X)
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define de cout<<"test"<
#define st system("pause");
#define pt cout<
int main()
{
int a;
while(cin>>a){
for(int i=0;i<a;i++){
int n,k;
cin>>n>>k;
string s;
cin>>s;
int cnt[26]={};
int ans=0;
for(int j=0;j<n;j++){
cnt[s[j]-'a']++;
}
int tmp[2005]={};
for(int j=1;j<=n;j++){
int g=__gcd(j,k);
int minr=1000000;
int num=j/g;
int maxr=0;
for(int r=0;r<26;r++)
maxr+=cnt[r]/num;
if(maxr*num>=j)
ans=max(ans,j);
}
cout<<ans<<endl;
}
}
return 0;
}
#include
using namespace std;
#define ll long long
#define ld double
#define pb push_back
#define ff(n) for(i=0; i
#define mo 1000000007
ll max(ll a,ll b){return (a>b)?a:b;}
ll min(ll a,ll b){return (a<b)?a:b;}
ll mm(vector<ll>a,vector<ll>b)
{
if(a[1]<b[1])
return true;
if(a[1]==b[1] && a[0]<b[0])
return true;
return false;
}
ll gcd(ll a,ll b)
{
while(1)
{
if(a==0)
return b;
b%=a;
if(b==0)
return a;
a%=b;
}
}
ll p2(ll k,ll n)
{
ll re=1;
while(n)
{
if(n%2==1)
re=(re*k)%mo;
k*=k;
k%=mo;
n/=2;
}
return re;
}
int main() {
ll n,m,i,j,t,k;
t=1;
cin>>t;
for(ll ii=0; ii<t; ii++)
{
cin>>n;
vector<ll>a(n),b(n);
for(i=0;i<n;i++)
{
cin>>a[i];
b[i]=a[i];
}
sort(b.begin(),b.end());
m=0;
k=0;
for(i=0;i<n;i++)
{
ll l=i;
k=0;
for(j=0;j<n;j++)
{
if(l==n)
break;
if(a[j]==b[l])
{
k++;
l++;
}
}
m=max(m,k);
}
cout<<n-m<<endl;
}
return 0;
}