Codeforces Round #805 (Div. 3)题解
得到所知的n一共有多少位,就可知目标数字,按原数字-目标数字即可。
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long t,n;
cin>>t;
while(t--)
{
cin>>n;
long long m=n,cnt=1;
while(m)
{
m/=10;
cnt*=10;
}
cout<<n-cnt/10<<endl;
}
}
利用set统计字串,当set的大小为4时,更新集合,并回到当前位置重新读入。
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long t,ans;
string s;
cin>>t;
while(t--)
{
cin>>s;
ans=0;
set<char>st;
for(int i=0;i<s.size();i++)
{
st.insert(s[i]);
if(st.size()==4)//尽可能多的放入已有题目许可的字符
{
ans++;
st.clear();
i=i-1;
}
}
if(st.size())ans++;
cout<<ans<<endl;
}
}
解决这一题有几个要点,第一,两个数字都要存在;第二,用两个mp分别映射某个数字第一次出现的位置和最后出现的位置,记录坐标;第三,只需比较前一个第一次出现的位置和后一个最后出现的位置。
#include<bits/stdc++.h>
using namespace std;
int b[200005];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
map<int,int>mp1,mp2;
for(int i=1;i<=n;i++)
{
cin>>b[i];
if(mp1[b[i]]==0)
{
mp1[b[i]]=i;
}
mp2[b[i]]=i;
}
for(int i=1;i<=m;i++)
{
int a,c;
cin>>a>>c;
if(mp1[a]&&mp1[c]&&mp1[a]<mp2[c])puts("YES");
else puts("NO");
}
}
}
有点绕脑子,总结如下罢:第一,定义一个结构体分别包含字符,坐标以及该字符是否要输出的标记;第二,要使删除的字符数量最少,则要按字符的大小顺序依次相加才不会浪费字符,所以要给字符数组进行排序;第三,按原有的字符坐标重新排序,最后对标记的字符进行输出。
#include<bits/stdc++.h>
using namespace std;
struct node
{
char c;
int num;
int p;
}t[200005];
bool cmp(node x,node y)
{
return x.c<y.c;
}
bool cmp2(node x,node y)
{
return x.num<y.num;
}
int main()
{
int x;
cin>>x;
map<char,int>mp;
for(char i='a';i<='z';i++)
{
mp[i]=(int)(i-96);
}
while(x--)
{
string s;
int n;
cin>>s>>n;//abca 2
for(int i=0;i<s.size();i++)
{
t[i].c=s[i];
t[i].num=i;
t[i].p=0;
}
sort(t,t+s.size(),cmp);
int sum=0;
for(int i=0;i<s.size();i++)
{
sum+=mp[t[i].c];
if(sum<=n)t[i].p=1;
else break;
}
sort(t,t+s.size(),cmp2);
for(int i=0;i<s.size();i++)
if(t[i].p==1)
cout<<s[i];
puts("");
}
}
他解:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
string s;
int m;
cin>>s>>m;
vector<int>st(220),b(220);//限制动态数组大小
for(auto i:s)
st[i]++;//出现字符的数量
for(char i='a';i<='z';i++)
{
b[i]+=min(m/(i-'a'+1),st[i]);//每个字符输出的数量
m-=b[i]*(i-'a'+1);//减去(字符的数量*字符的代表的大小·)
}
for(auto i:s)
{
if(b[i])
cout<<s[i];
}
puts("");
}
}
2022.7.11.完