B-Watches
题意:买表,表的原价为ai,如果买了k个表,则每个表要花ai+k*i元,给出拥有的钱,和想买的表的数量。求k的最大值
思路:k从1开始,每次将ai+=i,排序
AC代码:
#include <stdio.h>
#include <stdlib.h>
typedef long long ll;
int cmp(const void* a,const void* b);
ll tax(ll i);
int main()
{
ll N,M;
while(scanf("%lld %lld",&N,&M)!=EOF){
ll value[N];
ll a[N];
for(ll i=0;i<N;i++){
scanf("%lld",&value[i]);
}
ll k=0;
while(++k){
ll sum=0;
for(ll i=0;i<N;i++){
a[i]=value[i]+k*(i+1);
}
qsort(a,N,sizeof(ll),cmp);
for(ll i=0;i<k;i++){
sum+=a[i];
}
if(sum>M) break;
}
printf("%lld\n",k-1);
}
}
ll tax(ll i){
return i*(i+1)/2*i;
}
int cmp(const void* a,const void* b){
return *(int*)a-*(int*)b;
}
H-Cutting
题意:
求|x|+|y|+|x+y|<=n与去重后的总面积
思路:画图
AC代码:
#include <stdio.h>
#include <math.h>
const double pi=acos(-1);
double ans(double r);
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
printf("%.9lf\n",ans((double)n/2));
}
}
double ans(double r){
return pi*r*r/2+r*r*2;
}
I-Board Game
题意:有n个士兵,要分成m组(每组至少一个士兵),一起进攻一个水晶,每次造成1点伤害。水晶有x点血量,每次攻击会击杀一组中的k个士兵。士兵们和水晶依次进攻。问能否消灭水晶,如果可以,输出士兵们可以造成的最大伤害(这个时候认为水晶是无限血的)。
水晶采取最优策略
思路:水晶的攻击策略是每次攻击攻击场上士兵数量最多的一组。我们可以将士兵数n拆解为n=t*k+r的形式,其中r=Σ(a[i]%k)的形式(a[i]代表某组士兵的数量,a[i]>0) 根据题意可以得到r的范围。然后枚举t,再进行计算就好了
AC代码:
目录
K-Headphones
题意,有n对耳机,妹妹拿了k对,要拿的对数比她多,至少要拿多少只才能保证一定比她多。
思路:剩余n-k对每一对至少要拿一只,然后还要再拿k+1只凑成k+1对。
AC代码:
#include <stdio.h>
typedef long long ll;
int main()
{
ll n,k;
while(scanf("%lld %lld",&n,&k)!=EOF){
if(2*k+1<=n){
printf("%lld\n",(k+1)+(n-k));
}
else{
printf("-1\n");
}
}
}