题目过于简单,没啥好说的,但是拿了个第一感觉很爽,记录一下
题目1 : 小Hi与魔法 排序,从1开始递增
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=100005; int a[N]; int main() { int n; cin>>n; for(int i=0;i<n;i++)cin>>a[i]; sort(a,a+n); int ans=0,l=1; for(int i=0;i<n;i++) { if(a[i]==l) l++,ans++; else if(a[i]==l-1)ans++; else break; } cout<<ans<<"\n"; }
题目2 : 选项编码 就是map一下
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { string s; cin>>s; unordered_map<string,string>M; M["101"]="A"; M["11"]="B"; M["0"]="C"; M["100"]="D"; string t; for(auto X:s) { t+=X; if(M.count(t)) cout<<M[t],t=""; } }
题目3 : 假期旅行 直接dp当前天是不是可以到达,然后分别转移(题目不太好读懂
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=1005; char s[N][N]; int dp[N][N]; int main() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++)cin>>(s[i]+1); for(int i=0;i<m;i++)dp[0][i]=1; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { if(dp[i-1][j-1]&&s[i][j]=='O')dp[i][j]=1; if(dp[i][j-1]&&s[i][j]=='O')dp[i][j]=1; } int ans=-1; for(int i=1;i<=m;i++) if(dp[n][i]) { ans=i; break; } cout<<ans; }
题目4 : 脉冲星观测 说的是其中有一个多记了,所以只要看前面对,还是后面对就可以了,(当然可以都不对,3的情况)
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=100005; int a[N]; set<int>S; void la(int x) { //cout<<x<<"\n"; S.insert(1); S.insert(x); int y=sqrt(x+0.5); for(int i=2;i<=y;i++) if(x%i==0)S.insert(i),S.insert(x/i); } int main() { int n; cin>>n; for(int i=0;i<n;i++)cin>>a[i]; //cout<<a[1]-a[0]<<" "<<a[n-1]-a[n-2]<<"\n"; if(a[1]-a[0]!=a[n-1]-a[n-2]) { if(a[1]-a[0]!=a[2]-a[1]) la(a[n-1]-a[n-2]); if(a[n-2]-a[n-3]!=a[n-1]-a[n-2]) la(a[1]-a[0]); } else la(a[1]-a[0]); for(auto X:S)cout<<X<<"\n"; }