2021年ICPC上海站
阿新 • • 發佈:2021-11-28
E.Strange_Integers
簽到題,排序+貪心,因為只需要確定可以選擇的最大整數數,所以我們排序後遍歷一遍即可得出答案。
#include<iostream> #include<cstring> #include<algorithm> #include<vector> #include<map> #include<stack> #include<cmath> #define INF 0x3f3f3f3f using namespace std; typedef long long LL; const int maxn=1e5+9; int a[maxn],f[maxn],h[maxn]; int main() { ios::sync_with_stdio(false); int n,k; cin>>n>>k; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+1+n); int last=a[n]; int cnt=1; for(int i=n-1;i>=1;i--) { if(abs(a[i]-last)>=k) { last=a[i]; cnt++; } } cout<<cnt<<endl; return 0; }
D.Strange_Fractions
題意:給定一個正分數p/q,找出兩個整數a,b 使得p/q=a/b+b/a;
思路:由題意可得p/q=(a*a+b*b)/ab,ab=q,所以我們可以遍歷q的因子並判斷a*a+b*b是否等於q,又因為T<=1e5, p,q<=1e7,直接遍歷會TLE,所以在遍歷前應先使p,q除他們的最大公約數。
#include<iostream> #include<cstring> #include<algorithm> #include<vector> #include<map> #include<stack> #include<cmath> #define INF 0x3f3f3f3f using namespace std; typedef long long LL; const int eps=1e-6; int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } int main() { ios::sync_with_stdio(false); int t; cin>>t; while(t--) { bool flag=true; int p,q; cin>>p>>q; int t=gcd(p,q); p/=t; q/=t; for(int i=1;i<=q/i;i++) { if(q%i==0) { int a=i,b=q/i; if(a*a+b*b==p) { flag=false; cout<<a<<' '<<b<<endl; break; } } } if(flag) cout<<0<<' '<<0<<endl; } return 0; }