2022春季集训补题大合集(大一下)
个人赛-1
思路:从大到小排序,然后从头到尾遍历,每相邻两个数相差为偶数,则这两个数可以都变成他俩的平均数,对后面的数包括这两个数的后一个数他们相当于都增加了一个值,但这并不改变原本两两之间的差值。因此如果两两之间差值都为偶数,则可以变成同一个值。
Make Cents?
用unordered_map映射,unordered_map比map快。卡的很死,能用scanf的都用scanf。
#include <bits/stdc++.h> using namespace std; unordered_map<string,double>mp; int t,n,m; double x; string s; signed main() { scanf("%d",&t); while (t--) { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) { cin>>s; scanf("%lf",&x); mp[s]=x; } mp["JD"]=1.0; double sum=0; while (m--) { scanf("%lf",&x); cin>>s; sum+=mp[s]*x; } printf("%.6lf\n",sum); } return 0; }
Cheap Kangaroo
求所有数的最大公约数可以按顺序两两来求。
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll n,m,sum,x; ll gcd(ll a,ll b) { return b?gcd(b,a%b):a; } signed main() { int t; scanf("%d",&t); while (t--) { scanf("%lld%lld",&n,&m); sum=m; for (int i=1;i<n;i++) { scanf("%lld",&x); sum+=x; m=gcd(m,x); } printf("%.lld %lld\n",sum,m); } return 0; }
关闭同步流以后,一定不要再用scanf和printf了,会WA!!!