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

浙公网安备 33010602011771号