2023寒假训练week5

Day1

寒假每日一题


1.总伤害超过其防御力,那么这个战舰会爆炸
2.第一艘爆炸的战舰是在哪一轮攻击后爆炸的

#include <bits/stdc++.h>
using namespace std;
const int N=1e6;
int d[N];
int la[N],ra[N],lb[N],rb[N],lc[N],rc[N],h[N];
int main()
{
	int a,b,c,m;
	cin>>a>>b>>c>>m;
	//立方体 
	for(int i=1;i<=a;i++){//层 
		for(int j=1;j<=b;j++){//行 
			for(int k=1;k<=c;k++)//列 
			{
				int sum=((i-1)*b+(j-1))*c+(k-1)+1; 
				cin>>d[sum]; 
			}
		}
	
	}
/*
	sum=0;
	cout<<"-----------"<<endl;
	for(int i=1;i<=a;i++){//层 
		for(int j=1;j<=b;j++){//行 
			for(int k=1;k<=c;k++)//列 
			{
				cout<<d[++sum]<<" ";
				cout<<sum<<" ";
			}
		}	
	}
*/
	
	for(int i=1;i<=m;i++){
		cin>>la[i]>>ra[i]>>lb[i]>>rb[i]>>lc[i]>>rc[i]>>h[i];
	}
	for(int ans=1;ans<=m;ans++){
		for(int i=1;i<=a;i++){//层 
			for(int j=1;j<=b;j++){//行 
				for(int k=1;k<=c;k++)//列 
				{
					if(i>=la[ans]&&i<=ra[ans]&&j>=lb[ans]&&j<=rb[ans]&&k>=lc[ans]&&k<=rc[ans]){
						int num=((i-1)*b+(j-1))*c+(k-1)+1;
						d[num]-=h[ans];
					//	cout<<"d:"<<d[num]<<endl<<"num:"<<num<<endl; 
						if(d[num]<0){
							cout<<ans;
							return 0;
						}
					}
				}
			}
		}
	}
}

寒假每日一题

[蓝桥杯 2014 省 AB] 蚂蚁感冒

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
vector<int>a;
bool cmp(const int a,const int b){
	return abs(a)<abs(b);
}
int main()
{
	int n;
	cin>>n;
	int ganmao;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		if(i==1) ganmao=x;
		a.push_back(x); 
	}	
	sort(a.begin(),a.end(),cmp);
//	for(int i=0;i<n;i++) cout<<"a[i]"<<a[i]<<endl;
	vector<int>::iterator it;
	it=find(a.begin(),a.end(),ganmao);
	int res=it-a.begin();
//	cout<<"res="<<res<<endl;
	int sum=0;
	if(ganmao>0)
	{
		for(int i=res;i<n;i++)
		{
			if(a[i]<0) sum++;
		}
		if(sum>0)
		{
			for(int i=0;i<res;i++)
			{
				if(a[i]>0) sum++;
			}
		}
		else{
			cout<<1<<endl;
			return 0;
		}
//		cout<<"sum="<<sum<<endl;
	}
	else{
		for(int i=0;i<res;i++)
		{
			if(a[i]>0) sum++;
		}
		if(sum>0){
			for(int i=res;i<n;i++)
			{
				if(a[i]<0) sum++;
			}
		}
		else{
			cout<<1<<endl;
			return 0; 
		}
		cout<<sum<<endl;
	}
}

[蓝桥杯 2022 省 B] 刷题统计

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
	ll a,b,n;
	cin>>a>>b>>n;
	ll sum=0,ans=0;
	while(1){
		for(int i=1;i<=7;i++){
			ans++;
			if(i<=5) sum+=a;
			else sum+=b;
			if(sum>=n){
				cout<<ans<<endl;
				return 0; 
			} 
		}
	}
 }

[蓝桥杯 2022 国 B] 齿轮


找到任意两对的商=qi就可以

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
//int a[N],st[N];
//bool flag[N];
int n,q,t;
int st[N];
int a[N],flag[N];   //flag存当前数组中的数能构成哪些商值,作为qi 
int main()
{
	scanf("%d %d",&n,&q);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&t);
		st[t]=1;
		a[i]=t;
	}

	for(int i=1;i<=n;i++)
	{
		int up=sqrt(a[i]);
		
		for(int j=1;j<=up;j++)
		{
			if(a[i]%j==0) 
			{
				if(st[j])  flag[a[i]/j]=1;
				if(st[a[i]/j])   flag[j]=1;
			}
		}
	}
	for(int i=0;i<q;i++)
	{
		scanf("%d",&t);
		if(flag[t]) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

[蓝桥杯 2022 省 A] 求和

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
ll a[N];
ll s[N];
int main()
{
	ll n;
	cin>>n;
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	//求它们两两相乘再相加的和
	ll sum=0;
	for(ll i=1;i<=n;i++) s[i]=s[i-1]+a[i];
	
	for(ll i=1;i<n;i++)
	{
		sum+=a[i]*(s[n]-s[i]);
	}
	printf("%lld",sum);
	return 0;
}

[蓝桥杯 2022 省 B] 修建灌木

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e4+100;
ll a[N];
ll amax[N];
int n;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int t=max(i-1,n-i);
		cout<<2*t<<endl;
	}
	return 0;
}

Day3

SMU Winter 2023 Round #13 (Div.2)

B - BM 算日期

#include<bits/stdc++.h>
using namespace std;
const int N=9999;

bool Leap_Yaer(int year)
{
	return ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0));
}

int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int y,a;
		cin>>y>>a;
		int x=y+a;
//		cout<<"x1="<<x<<endl;
		if(x>N)
		{
			x=N-(x-N);
//			cout<<"x="<<x<<endl;
		}
		if(x<y){
			int swap=x;
			x=y;
			y=swap;
		}
		int ans=0;
		for(int i=y;i<=x;i++)
		{
			if (Leap_Yaer(i))
			{
				ans++;
			}	
		}
		cout<<ans<<endl;	
	}
	return 0;
}

E - BM 充饥

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string s;
	cin>>s;
	printf(" __      _____\n");
	printf("|  | ___/ ____\\____\n");
	printf("|  |/ /\\   __\\/ ___\\\n");
	printf("|    <  |  | \\  \\___\n");
	printf("|__|_ \\ |__|  \\___  >\n");
	printf("     \\/           \\/\n");
	return 0;
}

G-New Game


要想输出唯一,要按照字典序输出

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+100;
int e[N],ne[N],h[N],idx;
int d[N];
int q[N],tt=-1,hh=0;
//int n,m,a,b;
int n,m;

void add(int a,int b)
{
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void topsort()
{
	for(int i=1;i<=n;i++){//遍历一遍顶点的入度 
		if(d[i]==0) q[++tt]=i;//如果入度为0,入队列 
	}
	while(tt>=hh)//队列不为空
	{
		int a=q[hh++];//入队 
		for(int i=h[a];i!=-1;i=ne[i])
		{//循环删除a发出的边
			int b=e[i];//a有一条边指向b
			d[b]--;//删除边后,b的入度-1 
			if(d[b]==0)
			{//如果b的入度减为0,b入队列 
				q[++tt]=b;
			} 
		}
	}  
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{	
		cin>>n>>m;
		memset(h,-1,sizeof(h));//初始化邻接矩阵
		while(m--)
		{
			int a,b;
			cin>>a>>b;
			d[b]++;//顶点b的入度+1
			add(a,b);//添加到邻接矩阵 
		 } 
		 topsort();
		 for(int i=0;i<n;i++) cout<<q[i]<<" "; 
	}
	return 0; 
} 

H- Hsueh- Draw Progress

#include<bits/stdc++.h>
using namespace std;
const int N=20;
typedef long long ll;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		double n,m;
		cin>>n>>m;
		cout<<"[";
		for(int i=0;i<m;i++) cout<<"#";
		for(int i=0;i<n-m;i++) cout<<"-";
		cout<<"]"<<" ";
		int sum=m/n*100;
		printf("%d",sum);
		cout<<"%"<<endl;
	}
}

I. BM 旅游

#include<bits/stdc++.h>
using namespace std;
const int N=20;
typedef long long ll;

ll sum(int number)
{
    int sum=0;
	do
	{
		sum+=number%10;
		number=number/10; 
	}
	while (number!=0);
//	printf("%d\n",sum);
	return sum; 
}

int main()
{
	ll a,b,c,d;
	cin>>a>>b>>c>>d;
	int ans=0;
    if(sum(a)>=16||sum(a)==6)
    {
    	ans++;
	}
	  if(sum(b)>=16||sum(b)==6)
    {
    	ans++;
	}
	  if(sum(c)>=16||sum(c)==6)
    {
    	ans++;
	}
	if(sum(d)>=16||sum(d)==6)
    {
    	ans++;
	}
	if(ans==4) cout<<"Oh my God!!!!!!!!!!!!!!!!!!!!!"<<endl;
	if(ans==3) cout<<"Bao Bao is a SupEr man///!"<<endl;
	if(ans==2) cout<<"BaoBao is good!!"<<endl;
	if(ans==1) cout<<"Oh dear!!"<<endl;
	if(ans==0) cout<<"Bao Bao is so Zhai......"<<endl;
	
	return 0;
}

J. 大扫除


用map的我真的是当时脑子有坑
应该用set

#include<bits/stdc++.h>
using namespace std;
const int N=20;
typedef long long ll;

int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		ll ans=0;
		while(n--)
		{
			string s;
			cin>>s;
			map<char,bool>f; 
			for (int i=0;i<s.size();i++)
			{
				if(s[i]!='.'&&f[s[i]]!=true)
				{
//					cout<<"s[i]="<<s[i]<<" "<<"sum[i]="<<sum[s[i]]<<endl;
					ans++;
					f[s[i]]=true;
				}
			}
		}
		cout<<ans<<endl;
	}
}

Day5

SMU Winter 2023 Round #14 (Div.1+2)

A. 解开束缚缠丝Ⅱ

1.构成的最长回文串的长度是多少

2.分情况讨论,奇数的情况,偶数的情况

3.分别统计每个字符出现的次数

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int n;
int cnt[130];
int one = 0, ans = 0;
//统计每个字母的数目。奇数有一个放中间,偶数直接放两边 
LL  jiejue()
{
	cin >> n;
	for (int i = 'a'; i <= 'z'; ++i) {
		cnt[i] = 0;
	}
	for (int i = 'A'; i <= 'Z'; ++i) {
		cnt[i] = 0;
	}
	for (int i = 1; i <= n; ++i) {
		string x;
		cin >> x;
		cnt[x[0]]++;
	}
	one = ans = 0;
	for (int i = 'A'; i <= 'Z'; ++i) {
		if (cnt[i] % 2 != 0) {
			one = 1;
			ans += (cnt[i] - 1);
		}
		else ans += cnt[i];
	}
	for (int i = 'a'; i <= 'z'; ++i) {
		if (cnt[i] % 2 != 0) {
			one = 1;
			ans += (cnt[i] - 1);//如果是一个的话就摆不好 
		}
		else ans += cnt[i];
	}
	if(one==1){
		cout << ans +1 << endl;
	}
	else{
		cout<< ans<< endl;
	} 
}
int main()
{
	int t;
	cin>>t;
	while(t--){
		jiejue();
	}
} 

B.7的意志

1.寻找区间能相加等于7777的

2.用前缀和算出他们的前缀和,然后判断+7777的数是否在这个前缀和中

3.若在,找出他的最小下标

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N=1e5+10;
LL s[N]; 
LL a[N];
//输出一个整数代表有多少个不同的区间和为7777 
LL  jiejue()
{
	int n; 
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		s[i]=s[i-1]+a[i];//前缀和 
	}
	LL ans=0;
	for(int i=1;i<=n;i++){
		LL tar = s[i - 1] + 7777;//左边 i-1 
		LL x = lower_bound(s + 1, s + n + 1, tar) - s;//右边x 
		if (s[x] == tar) ++ans;
	} 
	cout<<ans<<endl;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	int t;
	cin>>t;
	while(t--){
		jiejue();
	}
	return 0;
} 

I. 好想听肆宝唱歌啊

1.关键是结构体排序

2.找到第k+1的歌曲名字

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
 
int n;
 
struct SONG {
	int w;
	string x;
}s[100005];//结构体 
 
bool operator<(const SONG &A, const SONG &B) {
		return A.w > B.w;
	};//自定义排序规则 
 
void jiejue() {
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		cin >> s[i].w >> s[i].x;
	}
	sort(s + 1, s + n + 1);
	int k;
	cin >> k;
	cout << s[k + 1].x<<endl;
}
 
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	LL t;
//	cin >> _;
	t= 1;
	while (t--) jiejue();
	return 0;
}

J. 毁灭凤凰人

1.有两种情况下能将凤凰人除外

2.送到墓地,再使用怪兽卡

3.没送到墓地,使用「墓穴的指名者」

 
#include<bits/stdc++.h>
using namespace std;
typedef long long LL; 
 
int n, m;
int mxa = 0, a = 0, b = 0;
 
void jiejue() {
	cin >> n >> m;//卡牌数量,毁灭凤凰人状态,0攻击1防守 
	for (int i = 1; i <= n; ++i) {
		int o, x;
		cin >> o;//卡牌种类。0状态附带攻击值 
		if (o == 0) {
			cin >> x;
			mxa = max(mxa, x);//只使用攻击值最大的卡牌 
		}
		else if (o == 1) a = 1;//1状态防守,使用完0卡将怪兽送走 
		 
		else b = 1;//2状态直接送走 
	}
	if (m == 0 && mxa >= 2500 && a) {//凤凰人攻击 ,并且我们有1卡 
		cout << "haoye\n";
		return;
	}
	else if (m == 1 && mxa > 2100 && a) {//凤凰人防守 ,并且我们有1卡 
		cout << "haoye\n";
		return;
	}
	else if (b && n >=2) {//只要保证n有两张以上的卡就可以直接送走 
		cout << "haoye\n";
		return;
	}
	else cout << "QAQ\n";
}
 
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	LL t;
//	cin >> t;
	t = 1;
	while (t--) jiejue();
	return 0;
}

K. 欢迎来到杭师大

直接输出

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e7+5;

int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++) {
    	cout<<"Welcome to HZNU"<<endl;
	}
	return 0;
}

L. Ayanoto 变形记

任意一个大于0的数,进行有限次的相加绝对都会加到某个数

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e7+5;

int sovel()
{
	int n,x;
	cin>>n>>x;
	if(x==0){
		cout<<"no"<<endl;
	}
	else cout<<"yes"<<endl; 
}

int main()
{
    int t;
    cin>>t;
    while(t--){
    	sovel();
	} 
	return 0;
}

M. P 龙学的教诲

1.每个单词每个单词的找,看标点是否在末尾

2.按照规则输出

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N=2e5;
LL n;
string x[N];
char note;
 
void print(int id) {//输出一整个单词 
	if (id != n) cout << x[id];//不等于最后一个单词 
	else {
		int len = x[id].length();
		for (int i = 0; i < len - 1; ++i) {//到len-2 
			cout << x[id][i];
		}
	}
}
 
LL  jiejue()
{
	//cin>>n;
	n=0; 
	while (1) {
		
		cin >> x[++n];
		//遇到空格看一下末尾有没有标点 
		int len = x[n].length();
		if (x[n][len - 1] == '.'|| x[n][len - 1] == '!' or x[n][len - 1] == '?') {
			note = x[n][len - 1];//标点存这 
			break;//找到标点直接break 
		}
	}
	for (int i = 1; i <= n / 2; ++i) { 
		print(i); //1~n/2 
		cout << ' ';
		print(n - i + 1);//n~n/2+1 
		if (i < n / 2 ||n % 2 == 1) cout << ' ';
	}
	if (n % 2 == 1){ //如果是奇数,偶数的最后一个数就是他 
		print(n / 2 + 1);
	}
	cout << note << endl;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	int t;
	cin>>t;//t行若干单词 
	while(t--){
		jiejue();
	}
	return 0;
} 

补题---第十三届西南民族大学程序设计竞赛(同步赛)

A.《落花》&&《红衣集》

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+10;
ll cost[N];
ll va[N];
int main()
{
	ll n;
	cin>>n;
	for(int i=1;i<=n-1;i++) cin>>cost[i];
	for(int i=1;i<=n-1;i++) cin>>va[i];
	ll maxco=cost[1],maxva=va[1];
	for(int i=2;i<=n-1;i++)
	{
		if(va[i]>maxva){
			if(va[i]>va[i+1]){
				maxva=va[i];
				maxco+=cost[i];
			}
			else if(va[i]<va[i+1]){
				maxva=va[i+1];
				maxco+=cost[i+1]; 
			}
            else{
            	maxva=va[i];
                maxco+=min(cost[i],cost[i+1]);
            }
		}
	}
	cout<<maxco<<endl;
	return 0;
 } 

D.既兴风前叹,重命花下酌。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e7+5;
const ll MOD=1e9+7;
ll cost[N];
ll va[N];
bool f[15];

int main()
{
    ll n;
    cout<<"FTFTTTF"<<endl;
    return 0;
}

E. 既兴风前叹,重命花下酌。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+10;
ll cost[N];
ll va[N];

int main()
{
	printf("\"xi\\nan\\min\\zu\\da\\xue,zhen\\mei!\"");
	return 0;
 } 

F.桃飘火焰焰,梨堕雪漠漠。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e7+5;
const ll MOD=1e9+7;
//ll time[N];
vector<int>ti;
ll like[N];
bool flag[N];

int main()
{
    int n,m,k;
    cin>>n>>m>>k;
	for(int i=0;i<n;i++){
		int x;
		cin>>x;
		ti.push_back(x);
	}
	
	for(int i=0;i<m;i++) cin>>like[i];
	
	ll sum=0;
	for(int i=0;i<m;i++){
		int j=like[i]-1;
		sum+=ti[j];//m个游戏必须玩
		ti[j]=1e5;
	}
	
	sort(ti.begin(),ti.end());
	
	for(int i=0;i<k-m;i++)
	{
		sum+=ti[i];
	}
	cout<<sum<<endl;
}

H.荷池堪作镜,盈盈可鉴心。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e7+5;
const ll MOD=1e9+7;
ll cost[N];
ll va[N];
ll f[N];

int main()
{
    f[1]=1;
    f[2]=2;
    f[3]=3;
    for(ll i=4;i<=10000000;i++)
        f[i]=(f[i-1]%MOD+f[i-3]%MOD)%MOD;
    ll n;
    cin>>n;
    cout<<f[n]<<endl;
    return 0;
} 

J.荷香莫深湎,终付秋风落。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e7+5;

int main()
{
    char c;
    bool flag;
	ll sum=0;
    while(scanf("%c",&c)!=EOF)
    {
    	if(c==':'){
    		flag=true;
		}
		else if(flag&&c=='w'){
			flag=false;
			sum++;
		}
		else flag=false;
	}
	cout<<sum<<endl;
}

L.相思子肯来,约在莲花岸。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e3+100;
//int num[N];
//int val[N];
//int dp[N][N];//N剩余水晶数 
ll xi[N],yi[N],xj[N],yj[N];
ll ki[N],kj[N];
ll juli(ll xi,ll yi,ll xj,ll yj)
{
	return (xi-xj)*(xi-xj)+(yi-yj)*(yi-yj);
}

int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++){
    	cin>>xi[i]>>yi[i]>>ki[i];
	}
	for(int i=0;i<m;i++){
		cin>>xj[i]>>yj[i]>>kj[i]; 
	}

	for(int i=0;i<n;i++){//我方 
		ll res=0,maxjuli=-1,minjuli=1e3;
		for(int j=0;j<m;j++)
		{
			if(ki[i]==1)
			{
				if(juli(xi[i],yi[i],xj[j],yj[j])>maxjuli)
				{
					res=j;
					maxjuli=juli(xi[i],yi[i],xj[j],yj[j]); 
				}
			}
			else{
				if(juli(xi[i],yi[i],xj[j],yj[j])<minjuli){
					res=j;
					minjuli=juli(xi[i],yi[i],xj[j],yj[j]);
				}
			} 
		}
		cout<<res+1<<" ";
	} 
	cout<<endl;
	for(int i=0;i<m;i++){//敌方 
		ll res=0,maxjuli=-1,minjuli=1e3;
		for(int j=0;j<n;j++)
		{
			if(kj[i]==1)
			{
				if(juli(xj[i],yj[i],xi[j],yi[j])>maxjuli)
				{
					res=j;
					maxjuli=juli(xj[i],yj[i],xi[j],yi[j]); 
				}
			}
			else{
				if(juli(xj[i],yj[i],xi[j],yi[j])<minjuli){
					res=j;
					minjuli=juli(xj[i],yj[i],xi[j],yi[j]);
				}
			} 
		}
		cout<<res+1<<" ";
	}
	return 0;
}

潇潇日暮时,掠水鸳鸯散。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e3+100;
int num[N];
int val[N];
int dp[N][N];//N剩余水晶数 

int main()
{
    int n,m;
    cin>>n>>m;
    //n是水晶数量
	//m是手牌 
    for(int i=1;i<=m;i++)
    {
    	cin>>num[i];
		cin>>val[i]; 
	}
	memset(dp,0,sizeof(dp));
	for(int i=1;i<=m;i++){
		for(int j=0;j<=n;j++){
			if(num[i]>j){//第一个要水晶数量大 
				dp[i][j]=dp[i-1][j]; 
			}
			else{
				dp[i][j]=max(dp[i-1][j],dp[i-1][j-num[i]]+val[i]);
			}
		}
	}
	cout<<dp[m][n]<<endl;
	return 0;
}
posted @ 2023-02-19 15:15  Is_Qinna  阅读(76)  评论(0)    收藏  举报