目录
Dashboard - Codeforces Round #793 (Div. 2) - Codeforces
要好好补题!!!
A. Palindromic Indices
题意:
一个回文串,删去其中一个字符后仍为回文串,输出可以这样删的字符有多少个。
do:
从中间开始,向左右两边统计相同的字符个数。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=1e5;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,ans=1;
cin>>n;
string s;
cin>>s;
for(int i=n/2+1;i<n;i++)
{
if(s[i]==s[n/2])
ans++;
else
break;
}
for(int i=n/2-1;i>=0;i--)
{
if(s[i]==s[n/2])
ans++;
else
break;
}
cout<<ans<<endl;
}
}
B. AND Sorting
题意:
给一串非正序的数字,寻找一个最大的X使得每次交换两个数字a,b的与值为X,最终的交换结果是排序正确的。
do:
找出要交换的每一个数字(就是顺序不对劲的,我是先用c数组存起来了,也可以用 (1 << 20) - 1直接挨个与),然后把他们全部做与。结果记为ans,则任意两个位置都可以以ans作为中转来实现位置的交换。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<stdlib.h>
#include<cmath>
using namespace std;
const int maxn=2e5+5;
int a[maxn],b[maxn],c[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,cnt=0,ans=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(a[i]!=i)
c[cnt++]=a[i];
}
ans=c[0];
for(int i=1;i<cnt;i++)
ans=ans&c[i];
cout<<ans<<endl;
}
}
C. LIS or Reverse LIS?
题意:
找序列的最大的lis值,和反转序列的最大lis值,输出二者的较小者;
do(solve2):
因为是严格递增,出现次数为两次的数字(cnt1个)会在正序列和反转序列中各用到一次。而只出现一次的值会被其中一个序列用到。
当只出现一次的值有奇数个时(cnt2%2!=0)会存在一个数字可以被正序列和反转序列都用到,此时结果+1;
solve1应该是化简版,我很难理解反正。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<stdlib.h>
#include<cmath>
#include<map>
using namespace std;
const int maxn = 2e5 + 5;
int a[maxn], b[maxn], c[maxn];
void solve1()
{
int n, x;
cin >> n;
map<int, int>note;//存点
int cnt = 0;
for (int i = 1; i <= n; i++)
{
cin >> x;
note[x]++;
if (note[x] <= 2)//x出现的次数小于等于2
cnt++;
}
cout << (cnt + 1)/2 << endl; //cnt/2向上取整
}
void solve2()
{
int n, x;
cin >> n;
map<int, int>note;//存点
int cnt1 = 0, cnt2 = 0;
for (int i = 1; i <= n; i++)
{
cin >> x;
note[x]++;
}
map<int, int>::iterator iter;
iter = note.begin();
for (;iter != note.end();)
{
if (iter->second >= 2)
cnt1++;
if (iter->second == 1)
cnt2++;
iter++;
}
int ans;
if(cnt2%2==0)
ans=cnt1+(cnt2/2);
else
ans=cnt1+(cnt2/2)+1;
cout << ans<< endl;
}
int main()
{
int t;
cin >> t;
while (t--)
{
solve2();
}
}