A. Integer Diversity
分析
给一个数组,你可以将数组的值更改正负,要使这个数组不同的值最大,求这个最大值。
一个正数可以记两次,0只能记一次,遍历记录出现次数就行了。
注意记录数组提前初始化。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=1e9+10;
const double pi=acos(-1);
int main()
{
int t;
cin>>t;
while(t--)
{
int n,a[110];
int ans=0;
cin>>n;
int tmp;
memset(a,0,sizeof(a));
for(int i=0;i<n;i++)
{
cin>>tmp;
tmp=abs(tmp);
a[tmp]++;
if(tmp==0&&a[tmp]==1)
{
ans++;
}
if(tmp!=0&&a[tmp]<=2)
{
ans++;
}
}
cout<<ans<<endl;
}
return 0;
}
B. Mirror in the String
分析
构造一个镜面字符串,使这个字符串满足字典序最小(不只是字符串长度越短越好,还要考虑字符之前的大小比如“cbaabc”字典序大小比“cc”大)
字符串a比字符串b字典序最小满足两个条件:
1.a是b的前缀,并且a不等于b
2.在a,b同一位置的字符字典序小
满足字典序最小,则需找出递减的最长字符,特殊考虑第一个字符和第二个字符相等的情况只输出第一个字符。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=1e9+10;
const double pi=acos(-1);
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
string s;
int f=0;
cin>>n>>s;
cout<<s[0];
for(int i=0;i<s.size()-1;i++)
{
if(s[i]>s[i+1])
{
cout<<s[i+1];
}
else if(i!=0&&s[i]==s[i+1])
{
cout<<s[i+1];
}
else
{
f=1;
for(int j=i;j>=0;j--)
{
cout<<s[j];
}
break;
}
}
if(!f)
{
for(int i=s.size()-1;i>=0;i--)
{
cout<<s[i];
}
}
cout<<endl;
}
return 0;
}
C. Representative Edges
分析
通过分析公式可得,题目为构成等差数列最少应更改几个数字。
题目数据较小,可直接采用暴力枚举首相和公差来做,分别计算两个数之间的公差,进行每一步修改,记录最小的操作数。注意,数据采用的double型,和0比较时应使用1e-6。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=1e4+10;
const ll mod=1e9+7;
const double pi=acos(-1);
double a[maxn],b[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
int cnt=0;
int mcnt=n;
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
cnt=0;
double d=(a[j]-a[i])/(j-i);//公差
// double a1=a[i]-(i-1)*d; //首相
for(int ii=1;ii<=n;ii++)
b[ii]=a[ii];
for(int ii=i+1;ii<=n;ii++)
{
if(abs(b[ii]-(b[ii-1]+d))>1e-6)
b[ii]=b[ii-1]+d,cnt++;
}
for(int ii=i-1;ii>0;ii--)
{
if(abs(b[ii]-(b[ii+1]-d))>1e-6)
b[ii]=b[ii+1]-d,cnt++;
}
mcnt=min(mcnt,cnt);
}
}
if(n<=2)
cout<<0<<endl;
else
cout<<mcnt<<endl;
}
return 0;
}