佳木斯集训Day1
23333第一次写博客
其实在佳木斯集训之前我都已经两三个月没打代码了
在佳木斯的时候前几天真心手生,导致了前几次考试考的很差...
D1的考试还是比较良心的,T1是一道大模拟,直接枚举最后几位是00,25,50,75的情况即可
一看数据范围1e18就知道铁定是O(n)了
(考试的时候不知道为什么wa70)
直接上代码
#include <bits/stdc++.h> #define ll long long using namespace std; char a[50]; int point,q,ans,length; bool flag=1,ju0,ju2,ju7,ju5; ll n=0,b=0; int main() { scanf("%s",&a); length=strlen(a); int c=0; for(int i=length-1;i>=0;i--) { b=b+int(a[i]-48)*pow(10,c); c++; if(int(a[i]-48)==5) ju5=1; else if(int(a[i]-48)==2) ju2=1; else if(int(a[i]-48)==7) ju7=1; else if(int(a[i]-48)==0) ju0=1; } if(b%25==0) { cout<<0<<endl; return 0; } for(int i=length-1;i>=0;i--) { if(a[i]=='0') { flag=0; point=i; swap(a[i],a[length-1]); break; } else if(a[i]=='5') { flag=0; point=i; swap(a[i],a[length-1]); break; } } if(flag==1) cout<<"-1"<<endl; else { flag=0; int t=0; ans=ans+length-point-1; for(int i=length-1;i>=0;i--) { n=n+int(a[i]-48)*pow(10,t); t++; } n=n/5; if(n%5==0) { cout<<ans<<endl; return 0; } else { t=0; while(n) { a[++t]=n%10; n/=10; } length=strlen(a); for(int i=length-1;i>=0;i--) { if(a[i]=='5'||a[i]=='0') { flag=0; point=i; swap(a[i],a[length-1]); break; } } if(ju5==1&&(ju2!=1&&ju7!=1&&ju0!=1)) { cout<<-1<<endl; return 0; } if(flag==1) cout<<"-1"<<endl; else { ans=ans+length-point-1; } cout<<ans<<endl; } } return 0; }
T2 比较水(现在看考试题都比较水)
就是需要判断这两个数组是否是严格单调的,考试的时候想到了,但不知道为啥wa10???
#include<bits/stdc++.h> using namespace std; int n,a[100100],b[100100],fa,fb,q=1; int main() { scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<=n;i++)scanf("%d",&b[i]); fa=a[1];fb=b[1]; for(int i=2;i<=n;i++) { if(fa>a[i]&&fb>b[i])fa=a[i],fb=b[i]; else if(fa<a[i]&&fb<b[i])continue; else {cout<<i-1<<endl; return 0;} } cout<<n<<endl; return 0; }
T3 是我D1唯一A的一道题23333,因为是并查集
#include <bits/stdc++.h> #define MAXN 100500 using namespace std; int n,m,k,x,y; int f[MAXN],a[MAXN],g[MAXN],point,h[MAXN],c,ans,s; bool v[MAXN],b[MAXN]; int find(int x) { if(f[x]==x) return x; f[x]=find(f[x]); return f[x]; } int main() { cin>>n>>m>>k; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) f[i]=i; for(int i=1;i<=m;i++) { cin>>x>>y; v[x]=1; v[y]=1; int t1=find(x); int t2=find(y); if(t1==t2) continue; f[t2]=t1; } for(int i=1;i<=n;i++) { if(v[i]) { if(!b[find(i)]) { b[find(i)]=1; g[++point]=find(i); } } } for(int i=1;i<=point;i++) { memset(h,0,sizeof(h)); c=0; ans=0; for(int j=1;j<=n;j++) { if(find(j)==g[i]) h[a[j]]++,c++; } for(int j=1;j<=n;j++) { if(h[j]>ans) { ans=h[j]; } } s=s-ans+c; } cout<<s<<endl; }
然后考完之后基本上是秒改AK的...
当天学的是数据结构(单调栈什么的,本来以为题水,谁知道每道题难度都是紫色啊)