2018/11/2 週五集訓隊第三次比賽補題題解
阿新 • • 發佈:2018-11-02
這次題目都比較親民啊。。。沒有什麼演算法題倒是
A.珠心算測試
注意是數量的個數,不是等式的個數。。。而且我上來兩發RE,也是很迷,直接用了map
程式碼
#include <bits/stdc++.h> using namespace std; map<int,int> num; map<int,int> bk; map<int,int> ans; map<int,map<int,int> > vis; int main() { int n,sum=0; cin>>n; for(int i=0;i<n;i++) cin>>num[i],bk[num[i]]=1; for(int i=0;i<n;i++) for(int j=0;j<n;j++) { if(i!=j) { if(bk[num[i]+num[j]]&&!vis[num[i]][num[j]]&&!vis[num[j]][num[i]]) { //cout<<num[i]+num[j]<<endl; vis[num[i]][num[j]]=vis[num[j]][num[i]]=1; if(!ans[num[i]+num[j]]) { ans[num[i]+num[j]]=1; //cout<<num[i]+num[j]<<endl; sum++; } } } } cout<<sum; }
B 比例簡化
這題明明這麼簡單。。。為啥大佬都不做啊- =,很迷。實際上兩個for進行列舉就行啊,暴力完全沒有問題
程式碼
#include <bits/stdc++.h> using namespace std; int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } int main() { double a,b,l,a1,a2,min=INT_MAX; cin>>a>>b>>l; double c=a/b; for(double i=1;i<=l;i++) for(double j=1;j<=l;j++) if(gcd(i,j)==1) { if(i/j>=c) { double d=i/j-c; if(d<min) { min=d; a1=i,a2=j; } } } cout<<a1<<" "<<a2; }
C.螺旋矩陣
紫書上的原題,唯一不同的是。。。這次開不出陣列來,那麼我們只好用陣列下標模擬一下
程式碼
#include <bits/stdc++.h> using namespace std; int bx[300005]; int by[300005]; int main() { int n,x,y,ans; cin>>n>>x>>y; int x1=1,y1=1,cnt=1; bx[1]=1; if(x==x1&&y==y1) return cout<<1,0; while(cnt<n*n) { while(y1+1<=n&&!by[y1+1]) { ans=++cnt; y1++; //cout<<ans<<endl; if(x==x1&&y==y1) return cout<<ans,0; //cout<<mp[x1][y1]<<" "<<cnt<<endl; } //cout<<x1<<" "<<y1<<endl; by[y1]=1; while(x1+1<=n&&!bx[x1+1]) { ans=++cnt; x1++; if(x==x1&&y==y1) return cout<<ans,0; } //cout<<x1<<" "<<y1<<endl; bx[x1]=1; while(y1-1>=1&&!by[y1-1]) { ans=++cnt; y1--; if(x==x1&&y==y1) return cout<<ans,0; } //cout<<x1<<" "<<y1<<endl; by[y1]=1; while(x1-1>=1&&!bx[x1-1]) { ans=++cnt; x1--; if(x==x1&&y==y1) return cout<<ans,0; } //cout<<x1<<" "<<y1<<endl; bx[x1]=1; } //cout<<mp[x][y]; }
D.子矩陣
待研究
E.計數問題
還是紫書上的原題,直接用stringstream暴力破解,然後800多ms罰時。。。不過寫的快
程式碼
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,x,sum=0;
cin>>n>>x;
for(int i=1;i<=n;i++)
{
stringstream s;
s<<i;
string ans;
s>>ans;
for(int i=0;i<ans.size();i++)
if(ans[i]==char(x+'0'))
sum++;
}
cout<<sum;
}