第 1 题:0的个数
注意点:注意要从str.length()-1开始,因为最后一个是换行符
#include<bits/stdc++.h>
using namespace std;
string str;
int ans=0;
int main()
{
cin>>str;
for(int i=str.length()-1;i>0;i--)
{
if(str[i]=='0')ans++;
else break;
}
cout<<ans<<endl;
}
第 2 题:超级质数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
bool b[100000005];
int a[1000005];
void su(int n)
{
int i,j,t=1;
for(i=2; i<=n; i++)
{
if(b[i]==0)a[t++]=i;
for(j=1; j<t&&(i*a[j])<=n; j++)
{
b[i*a[j]]=1;
if(i%a[j]==0)break;
}
}
}
int solve(int x)
{
int shu[11];
int sh[11];
int m=0;
int c=0,sum;
while(x)
{
sh[c++]=x%10;
x/=10;
if(sh[c-1]==1||sh[c-1]==0){
return 0;
}
}
for(int i=0; i<c; i++)
{
shu[i]=sh[c-i-1];
}
m=c;
for(int j=0; j<m; j++)
{
for(int k=0; k<m-j; k++)
{
sum=0;
for(int i=0; i<=j; i++)
{
sum=sum*10+shu[i+k];
}
if(b[sum]==1)
{
return 0;
}
}
}
return 1;
}
int main()
{
int n=34999,max;
su(35000);
for(int i=0;i<n;i++){
if(solve(i)){
max=i;
}
}
printf("%d",max);
}
第 3 题:卡牌
思路:注意看m的范围!!!!!!!!!!!!m已经超过int的大小了,需要开longlong!!!!!!!!!!
(因为m的范围愣是卡了这么久还没发现 QAQ )
#include<bits/stdc++.h>
using namespace std;
const int N=4e5+10;
long long n,m;
struct point {
int a,b;
} p[N];
void solve() {
while(true) {
sort(p,p+(n>10?100:n),[](point a, point b) {
return a.a <= b.a;
});
if(p[0].b>0&&m>=1) {
p[0].b--;
p[0].a++;
m--;
} else break;
}
}
int main() {
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=0; i<n; i++)cin>>p[i].a;
for(int i=0; i<n; i++)cin>>p[i].b;
sort(p,p+n,[](point a, point b) {
return a.a <= b.a;
});
int k=0;
bool flag=false;
while(true) {
long long t=p[k+1].a-p[k].a;
for(int i=0; i<k&&i<n; i++) {
if(p[i].b>=t&&m>=t) {
p[i].a+=t;
p[i].b-=t;
m-=t;
} else {
solve();
flag=true;
break;
}
}
if(flag)break;
k++;
}
cout<<p[0].a<<endl;
}