浙江省赛2019
分类:
IT文章
•
2024-07-06 23:30:31
ZOJ - 4105
签到;
#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
const double PI=acos(-1.0);
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3fll;
const int eps=1e-9;
const ll mod=1e9+7;
int rd() {
int x=0,w=1;
char ch=0;
while (ch<'0'||ch>'9'){if (ch == '-') w=-1;ch = getchar();}
while (ch>='0'&& ch <='9'){x=x * 10+(ch-'0');ch = getchar();}
return x*w;
}
const int maxn=1e6;
int main(){
int t;
scanf("%d",&t);
while(t--){
string ans,s;
cin>>s;
int len=s.size();
ans+=s[0];
for(int i=1;i<len;i++){
if(s[i]=='a'||s[i]=='e'||s[i]=='i'||
s[i]=='y'||s[i]=='o'||s[i]=='u')
continue;
ans+=s[i];
}
cout<<ans<<endl;
}
return 0;
}
View Code
ZOJ - 4106
签到
#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
const double PI=acos(-1.0);
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3fll;
const int eps=1e-9;
const ll mod=1e9+7;
int rd() {
int x=0,w=1;
char ch=0;
while (ch<'0'||ch>'9'){if (ch == '-') w=-1;ch = getchar();}
while (ch>='0'&& ch <='9'){x=x * 10+(ch-'0');ch = getchar();}
return x*w;
}
const int maxn=1e5+5;
int main(){
int n,t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
int m=n;
for(m=n; ;m++){
if(m%7==0&&m%4!=0){
break;
}
}
printf("%d
",m);
}
return 0;
}
View Code
ZOJ - 4108
题意:就是给你a,b;然后让你求二者之间斐波那契之和的奇偶;但数据达到了1e1000
考虑这样做,斐波那契是 奇数,,奇数,偶数;然后只要看看a,b在第几位就好了;
1 1 或者2 2或者2 0 或者0 1 就是1;其他情况都是0;
这里我犯了一个傻逼错误,就是3%3肯定是0呀;注意一下就好了
#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
const double PI=acos(-1.0);
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3fll;
const int eps=1e-9;
const ll mod=1e9+7;
int rd() {
int x=0,w=1;
char ch=0;
while (ch<'0'||ch>'9'){if (ch == '-') w=-1;ch = getchar();}
while (ch>='0'&& ch <='9'){x=x * 10+(ch-'0');ch = getchar();}
return x*w;
}
const int maxn=1e6;
int main(){
int t;
scanf("%d",&t);
while(t--){
string a,b;
cin>>a>>b;
ll sum1=0,sum2=0,x,y;
int len1=a.size();
for(int i=0;i<len1;i++){
sum1+=a[i]-'0';
}
int len2=b.size();
for(int i=0;i<len2;i++){
sum2+=b[i]-'0';
}
if(sum1>sum2)swap(sum1,sum2);
x=sum1%3;
y=sum2%3;
// cout<<"test:"<<endl;
// cout<<sum1<<" "<<sum2<<endl;
if(x==1&&y==1&&sum2>sum1
||x==2&&y==2&&sum2>sum1||x==2&&y==0
||x==0&&y==1)puts("1");
else puts("0");
}
return 0;
}
View Code
ZOJ - 4107
题意:就是给个序列,噪音点满足 a[i]>a[i-1]&&a[i]>a[i+1] ;你最多可以删除一个点,问你怎么做使得噪音点最小;
做法:开始想暴力做法,就是枚举每一个数,试一试他的噪音点最小值,那当然是T了;
这题让我明白了 前缀和的用法:
就比如说,你要频繁求一个区间的某个值的和,用暴力做法肯定是要扫一遍,这应该算是用空间换时间的思想吧;
就是我用一个sum存每一个节点前面待求值的和 然后两者相减即可;
那这题怎么想呢?
你要把一个点踢掉,那这个 sum[i-2]+sum[n]-sum[i+1] 必然是去掉i这个点的情况和;
如果 a[i-1]>a[i-2]&&a[i-1]>a[i+1] 说明左边又构成一个新点;
如果 a[i+1]>a[i-1]&&a[i+1]>a[i+2] 说明右边又构成一个新点;
加一下就好了;
然后处理好边界值,从 2到n-1枚举;
这题卡0x3f3f3f3f;应该用0x7fffffff处理;
#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f3f3f3f3fLL;
const int inf=0x7fffffff;
const int maxn=1e5+10;
int sum[maxn],a[maxn];
int main(){
int n,t;
scanf("%d",&t);
while(t--){
memset(sum,0,sizeof sum);
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
if(n<3){
puts("0");
continue;
}
a[i]>a[i-1]&&a[i]>a[i+1]
a[0]=a[n+1]=inf;
sum[0]=0;
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+(a[i]>a[i-1]&&a[i]>a[i+1]);
}
int ans=sum[n];
if(a[2]>a[1]&&a[2]>a[3])ans=min(ans,sum[n]-1);
if(a[n-1]>a[n]&&a[n-1]>a[n-2])ans=min(ans,sum[n]-1);
for(int i=2;i<n;i++){
ans=min(ans,sum[n]-sum[i+1]+sum[i-2]+(a[i-1]>a[i-2]&&a[i-1]>a[i+1])+(a[i+1]>a[i-1]&&a[i+1]>a[i+2]));
}
printf("%d
",ans);
}
return 0;
}
View Code