题意:给定字符串,确定没有前置0,求使得字符串模10^y后剩余10^x;
思路:按题意模拟。。。
#include<bits/stdc++.h>
using namespace std;
char s[200005];
int main(){
int n,x,y;
scanf("%d%d%d",&n,&x,&y);
string s;
cin>>s;
int ans=0;
int l=s.size();
for(int i=l-1;i>=l-y;i--){
if(s[i]=='1')
ans++;
}
if(s[l-y-1]=='0')
ans++;
for(int i=l-y-2;i>=l-x;i--){
if(s[i]=='1')
ans++;
}
printf("%d\n",ans);
}
题意:给定n个比赛,每场比赛有ai个题目,他第i天最多做i个题目,如果少于i个题目那么就不做,求最多可以做几天题。
思路:模拟。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[200005];
int n;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int ans=1;
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
{
if(a[i]>=ans)
ans++;
else continue;
}
printf("%d\n",ans-1);
return 0;
}
题意:给定字符串,如果长度是偶数并且偶数位与他的后一位不同,那么这字符串就是好的,求删除的最少次数,并输出好的字符。
思路:栈模拟。
#include<bits/stdc++.h>
using namespace std;
int vis[200005];
stack<char>s1;
int main(){
int n;
scanf("%d",&n);
memset(vis,0,sizeof(vis));
string s,t,str;
cin>>s;
str=s;
int ans=0,l=s.size();
s1.push(s[0]);
int f=0;
for(int i=0;i<l;i++){
if(s[i]==s1.top()&&f==0){
continue;
}
else {
s1.push(s[i]);
f=!f;
}
}
if((s1.size())%2==0){
printf("%d\n",l-s1.size());
while(!s1.empty()){
t+=s1.top();
s1.pop();
}
for(int i=t.size()-1;i>=0;i--)
printf("%c",t[i]);
}
else{
s1.pop();
printf("%d\n",l-s1.size());
while(!s1.empty()){
t+=s1.top();
s1.pop();
}
for(int i=t.size()-1;i>=0;i--)
printf("%c",t[i]);
}
}
题意:给定一个数的因子,判断这个数是否存在,存在输出此数。
思路:最大乘最小,如果该数的因子数等于n-2并且该数可以整除所有的数那么该数就是要求的数。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[305];
ll count(ll a)
{
ll sum=0;
for(ll i=1;i<=sqrt(a);i++)
{
if(a%i==0)
{
sum++;
if(a/i!=i)sum++;
}
}
return sum-2;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll n,b;
scanf("%lld",&n);
ll ans=1;
ll mx=-5,mn=1e6+5;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
mx=max(mx,a[i]);
mn=min(mn,a[i]);
}
ans=mn*mx;
if(count(ans)!=n)
printf("-1\n");
else {
int f=0;
for(int i=1;i<=n;i++){
if(ans%a[i]!=0){
f=1;
break;
}
}
if(f==0){
printf("%lld\n",ans);
}
else puts("-1");
}
}
return 0;
}
E. Two Arrays and Sum of Functions
题意:f(l,r)=∑l≤i≤rai⋅bif(l,r)=∑l≤i≤rai⋅bi.重新排序b数组,使得∑1≤l≤r≤nf(l,r)∑1≤l≤r≤nf(l,r) 最少。
思路:ai的贡献是ai*i*(n-i+1),那么我们排序两个数组使得最少乘以最大。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[1000005],b[1000005];
const int mod=998244353;
int main(){
int n;
scanf("%d",&n);
for(ll i=1;i<=n;i++)
scanf("%lld",&a[i]),a[i]=1ll*a[i]*(i)*(n-i+1);
for(int i=1;i<=n;i++)
scanf("%lld",&b[i]);
sort(a+1,a+1+n);
sort(b+1,b+n+1);
ll ans=0;
for(int i=1;i<=n;i++){
ans=(ans+((a[i]%mod)*b[n-i+1]%mod)%mod)%mod;
}
printf("%lld\n",ans);
}
F1. Microtransactions (easy version)
F2. Microtransactions (hard version)
题意:每天可以得到一块钱,有些商品要买,在优惠那天要1块钱,否则要2块钱,求最少花费多少钱可以买所有商品。
思路:二分。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
typedef long long ll;
ll a[N],b[N];
vector<int>v[N<<1];
int n,m;
ll sum;
bool check(ll mid){
ll s=0;
ll temp=sum;
for(int i=1;i<=n;i++)
b[i]=a[i];
for(ll i=mid;i>=1;i--){
for(int j=0;j<v[i].size();j++){
while(b[v[i][j]]&&mid){
mid--;
temp--;
b[v[i][j]]--;
}
}
if(mid>=i){
mid--;
s++;
}
}
return s/2>=temp;
}
int main(){
sum=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
sum+=a[i];
}
int d,t;
for(int i=1;i<=m;i++){
scanf("%d%d",&d,&t);
v[d].push_back(t);
}
ll l=sum,r=2*sum,ans;
while(l<=r){
ll mid=(l+r)/2;
if(check(mid)){
ans=mid;
r=mid-1;
}
else l=mid+1;
}
printf("%lld\n",ans);
}