这题要开两个map,以得到每个选手的最终分数和当前选手的分数。
注意遍历时当前分数大于等于mx 并且最后分数等于mx(这个条件不要漏掉了)
#include
using namespace std;
const int N=2400;
string a[N];
int n,x,mx,cnt,b[N];
map<string,int>vis1,vis2;
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i]>>b[i];
vis1[a[i]]+=b[i];//vis1记录每个选手的最终分数
}
for(int i=1;i<=n;i++)
mx=max(mx,vis1[a[i]]);
for(int i=1;i<=n;i++)
{
vis2[a[i]]+=b[i];//vis2记录当前选手的分数
if(vis2[a[i]]>=mx&&vis1[a[i]]==mx)//这里注意还要写上 vis1[a[i]]==mx 的条件
{printf("%s\n",a[i].c_str());break;}
}
return 0;
}
要快速求某个数的因子个数,可以用唯一分解定理(当然这题数据小,可以直接暴力)
#include
using namespace std;
typedef long long ll;
ll x,y,ans=1;
int main()
{
ios::sync_with_stdio(false);
cin>>x>>y;
ll k=__gcd(x,y);
for(ll i=2;i*i<=k;i++)
{
ll c=0;
while(k%i==0)
k=k/i,c++;
ans*=(c+1);
}
if(k>1)ans*=2;
printf("%lld\n",ans);
return 0;
}
#include
using namespace std;
int n,w,t,cnt,ans,a[30];
int main()
{
cin>>n;
for(int i=0;i<n;i++)//i必须要从0开始,不能从1开始
cin>>a[i];
cin>>w;
for(int i=1;i<(1<<n)-1;i++)//i=0代表一个都不选,i=2^n-1代表所有都选,除去这两个即可
{
t=w;cnt=0;//t为剩余的钱
for(int j=0;j<n;j++)
{
if(i&(1<<j))
{t=t-a[j];cnt++;}
}
if(t>=0&&cnt%4==0&&t%4==0)ans++;//注意t>0
}
printf("%d\n",ans);
return 0;
}
打表找规律,可以发现 a[n]=6*3(n-1),用快速幂求解即可。
#include
using namespace std;
typedef long long ll;
ll n,mod=1e9+7;
ll quickmod(ll a,ll b)
{
ll s=1;
while(b)
{
if(b&1)s=s*a%mod;
a=a*a%mod;b=b/2;
}
return s;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
printf("%lld\n",6*quickmod(3,n-1)%mod);//注意算出3的n-1次幂,再乘以6之后一定还要再取模!
return 0;
}
#include
using namespace std;
int n,k;
string a[110];
bool cmp(string x,string y)
{return x<y;}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1,cmp);
printf("%s\n",a[k].c_str());
return 0;
}
#include
using namespace std;
int main()
{
double x,y,z,r,xx,yy,zz,s;
ios::sync_with_stdio(false);
cin>>x>>y>>z>>r>>xx>>yy>>zz;
s=fabs(sqrt((xx-x)*(xx-x)+(yy-y)*(yy-y)+(zz-z)*(zz-z))-r);//注意取绝对值
printf("%.2lf\n",s);
return 0;
}