浙江省赛2019
F - Abbreviation
签到;
#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; }
G - Lucky 7 in the Pocket
签到
#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\n",m); } return 0; }
I - Fibonacci in the Pocket
题意:就是给你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; }
H - Singing Everywhere(学到许多)
题意:就是给个序列,噪音点满足 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\n",ans); } return 0; }
待更新;
想的太多,做的太少;