持续更新~~直到省赛
#8 The 14-th BIT Campus Programming Contest()GYM
A - 两只脑斧
# include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
string a;
char f[10]={'X','E','I','E','I','E','I','I'};
scanf("%d",&n);
getchar();
for(int i=0;i<n;i++){
cin>>a;
getchar();
printf("%c",f[a[0]-'0']);
}
return 0;
}
K - 多项式求导
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a[120];
const LL mod=998244353;
int main()
{
LL n,k;
scanf("%lld %lld",&n,&k);
for(LL i=n;i>=0;i--){
scanf("%lld",&a[i]);
}
for(LL i=0;i<k;i++){
printf("0 ");
}
for(LL i=n;i>=0;i--){
if(i>=k){
for(LL j=i;j>(i-k);j--){
a[i]=((a[i]%mod)*(j%mod))%mod;
}
a[i]=a[i]%mod;
printf("%lld ",a[i]);
}else{
break;
}
}
return 0;
}
F - 风王之瞳
我太傻逼了,居然以为算一类边长要分别对长和宽做组合数,。。。,然而是不用的,阔以直接算出来的。
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
int t;
scanf("%d",&t);
while(t--){
LL n,m;
LL sum=0;
scanf("%lld %lld",&n,&m);
LL end=min(n,m);
for(LL i=1;i<=end;i++){
if(i==1){
sum+=(n*m);
//cout<<sum<<endl;
}else{
LL dn=(n-(i-1));
LL dm=(m-(i-1));
sum+=(dn*dm*i);
//cout<<sum<<endl;
}
}
printf("%lld\n",sum);
}
return 0;
}
H - 目标是成为数论大师
其实就是解方程组,但是有一个坑点就是要注意增根的情况,把他去掉
# include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--){
int a,b;
scanf("%d %d",&a,&b);
int g=4*a*b+a*a;
if(g<0){
}else if(g==0){
printf("1\n");
printf("%d\n",(2*b+a)/2);
}else if(g>0){
int flag1=0,flag2=0;
int x=((2*b+a)-sqrt(g))/2;
int y=((2*b+a)+sqrt(g))/2;
if((sqrt(a*x)+b)==x){
flag1=1;
}
if((sqrt(a*y)+b)==y){
flag2=1;
}
if(flag1&&flag2){
printf("2\n");
printf("%d %d\n",x,y);
}else{
printf("1\n");
if(flag1){
printf("%d\n",x);
}else{
printf("%d\n",y);
}
}
}
}
return 0;
}
C - 赛尔逵传说
c老师教的:(蟹蟹萌萌的c老师)x次打死一只小怪兽,收到x-1次伤害,使用一个道具相当于增加一次攻击,也就少了一次伤害。然后把这些抵消伤害的机会用在攻击高的小怪兽上。按照血量可以算出,每个小怪兽攻击几次,选择最大的c个,尽量让多出来的一次攻击减少最多的伤害。
血的教训,开 long long要开得彻底。。。
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAXN=1e5+10;
pair<LL,LL> p[MAXN];
int main()
{
LL n,k,c;
scanf("%lld %lld %lld",&n,&k,&c);
for(LL i=0;i<n;i++){
scanf("%lld %lld",&p[i].second,&p[i].first);
}
sort(p,p+n,greater<pair<LL,LL> >());
// for(int i=0;i<n;i++){
// cout<<i<<" "<<p[i].first<<" "<<p[i].second<<endl;
// }
//p[i].second是血量,p[i].first是攻击值
LL l;
for(LL i=0;i<n;i++){
LL d=p[i].second/k-1;//d为需要的果子数
if(p[i].second%k!=0){
d++;
}
if((c-d)<=0){
p[i].second-=(c*k);
l=i;
if((c-d)==0) l++;
break;
}else{
c-=d;
}
}
//cout<<l<<endl;
LL sum=0;
for(LL i=l;i<n;i++){
LL ans=p[i].second/k;//ans为收到的攻击次数
if(p[i].second%k==0){
ans--;
}
sum+=(ans*p[i].first);
}
printf("%lld",sum);
return 0;
}