ZZUACM省赛训练

持续更新~~直到省赛

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_44378175/article/details/89529685