题目大意:
给定整数 n ,表示存在长度为 ⌊i⌋(i∈[1,n]) 宽度为 1 的木板,求这些木板能够拼接成的变长最大的正方形。
思路:看样例可以发现当就是答案
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
int maxv=(n+1)/2;
printf("%d\n",maxv);
}
return 0;
}
题目大意:定义一种特殊的数字串当且仅当该串出现的数字种类大于等于出现次数最多的数
求这个字符串中有多少个这样的子串
思路:暴力,最坏情况下每个数最多就0到9,一个字符串中最多出现10种数字,每一种数字的个数为10,那字符串的长度为100,只要枚举长度100即可,只要种类大于出现最多次数数的个数就答案加1
#include<bits/stdc++.h>
using namespace std;
int n;
void solve()
{
scanf("%d",&n);
string s;
cin>>s;
s="?"+s;
int cnt[20];
memset(cnt,0,sizeof cnt);
int ans=0;
int mx,color;
for(int i=1;i<=n;i++)
{
mx=0,color=0;
memset(cnt,0,sizeof cnt);
for(int j=i;j<=min(i+99,n);j++)
{
cnt[s[j]-'0']++;
if(cnt[s[j]-'0']==1)color++;
mx=max(mx,cnt[s[j]-'0']);
if(color>=mx)ans++;
}
}
printf("%d\n",ans);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
solve();
}
return 0;
}
题目大意:给一组数,当ai=0的时候你可以把ai替换成任意的数, 最终使得总和为0,且前缀和数组中出现0的次数最多。
思路:从后往前遍历,当ai为0的时候,假设上一个是0的位置为ak,把ans加上i到k中出现次数最多的元素所出现的次数,然后再从前往后遍历前缀和数组,如果前缀和si为0,而a数组第一个是0的位置小于i的话就让答案加1
#include<bits/stdc++.h>
using namespace std;
const int N=210000;
#define int long long
int n;
int a[N],s[N],st[N];
int mx;
map<int,int>mp;
void add(int x)
{
mp[x]++;
mx=max(mx,mp[x]);
}
void mclear(int x)
{
mx=0;
for(int i=x;i<=n;i++)
{
if(st[i])return;
else
{
mp[s[i]]--;
st[i]=true;
}
}
}
void solve()
{
mp.clear();
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
s[i]=s[i-1]+a[i];
st[i]=0;
}
int res=0;
mx=0;
for(int i=n;i>=1;i--)
{
add(s[i]);
if(a[i]==0)
{
res+=max(1ll,mx);
mclear(i);
}
}
for(int i=1;i<=n;i++)
{
if(a[i]==0)break;
else if(s[i]==0)res++;
}
cout<<res<<endl;
}
signed main()
{
ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--)
{
solve();
}
return 0;
}