首页 > 其他分享 >Living-Dream 系列笔记 第17期

Living-Dream 系列笔记 第17期

时间:2024-03-09 12:38:06浏览次数:30  
标签:std Living 下标 17 int && using include Dream

Problem

T1

/*
思路:分类讨论:
若k=0,则输出x+1;
若k>tot(x的位数),则输出1+k-tot个0+x;
否则输出10^k+x。
*/
#include<bits/stdc++.h>
using namespace std;

long long k,x,tot,ans=1; //开long long

int main(){
	cin>>k>>x;
	if(k==0){ cout<<x+1; return 0; } //情况1
	long long tmp=x;
	while(tmp) tot++,tmp/=10; //计算tot
	if(x==0) tot=1; //特判x=0
	//cout<<x<<'\n';
	if(k>tot){ //情况2
		cout<<1;
		for(int i=1;i<=k-tot;i++) cout<<0;
		cout<<x;
		return 0;
	}
	for(int i=1;i<=k;i++) ans*=10;
	cout<<ans+x; //情况3
	return 0;
}

T2

/*
思路:
循环模拟n次猜拳过程,
若AB出的拳不同,则对于A赢和B赢两种情况进行讨论,并更新得分;
然后将AB出拳周期下标+1即可。
*/
#include<bits/stdc++.h>
using namespace std;

int n,la,lb,pa,pb,sa,sb; //n,A/B周期长,A/B周期下标,A/B得分
int a[231],b[231]; //A/B周期

int main(){
	cin>>n>>la>>lb;
	for(int i=1;i<=la;i++) cin>>a[i];
	for(int i=1;i<=lb;i++) cin>>b[i];
	
	int pa=1,pb=1;
	for(int i=1;i<=n;i++){
		if(a[pa]!=b[pb]){ //若出拳不同
			if(a[pa]==0&&b[pb]==1||a[pa]==0&&b[pb]==4||a[pa]==1&&b[pb]==2||a[pa]==1&&b[pb]==4||a[pa]==2&&b[pb]==0||a[pa]==2&&b[pb]==3||a[pa]==3&&b[pb]==0||a[pa]==3&&b[pb]==1||a[pa]==4&&b[pb]==2||a[pa]==4&&b[pb]==3) sb++; //B赢
			else sa++; //A赢
		}
		pa++; if(pa>la) pa=1; //更新A下标
		pb++; if(pb>lb) pb=1; //更新B下标
		//cout<<pa<<' '<<pb<<'\n';
	}
	cout<<sa<<' '<<sb;
	return 0;
}

T3

/*
思路:
首先观察样例可知朝内则左减右加,朝外则左加右减;
于是对于第z条指令,先令s=s%n;
若情况1:该指令朝内且向右或朝外且向左,则令下标p=(p+s)%n;
否则情况2:令p=(p-s)%n+n;
为了方便处理,我们可以从0下标开始。
*/
#include<bits/stdc++.h>
using namespace std;

int n,m,p=0;
struct node{ //存储小人的名字和朝向
	string name;
	int dir;
}a[100031];

int main(){
	//freopen("P1563_4.in","r",stdin);
	cin>>n>>m;
	for(int i=0;i<n;i++) cin>>a[i].dir>>a[i].name; //0下标
	//cout<<mod(2,1);
	for(int i=1,d,x;i<=m;i++){
		cin>>d>>x;
		x%=n;
		//cout<<d<<' '<<x<<'\n'; 
		if(a[p].dir==0&&d==0){ //情况2
			p=(p-x<0?p-x+n:p-x);
			//if(p<0) p+=(abs(p)/n+1)*n;
		}
		else if(a[p].dir==0&&d==1) p=(p+x>=n?p+x-n:p+x); //情况1
		else if(a[p].dir==1&&d==0) p=(p+x>=n?p+x-n:p+x); //情况1
		else{ //情况2
			p=(p-x<0?p-x+n:p-x);
			//if(p<0) p+=(abs(p)/n+1)*n;
		}
		//cout<<p<<'\n';
	}
	cout<<a[p].name;
	return 0;
}

T4

/*
思路:考虑贪心,为了使等待时间更短,我们应当将接水时间更短的人排在靠前位置;
因此,仅需对接水时间排序,并计算等待时间总和即可。
*/
#include<bits/stdc++.h>
using namespace std;

int n;
struct node{ //需要使用结构体排序
	int x,id;
}t[1031];
double avg; //要用double

bool cmp(node a,node b){
	return a.x<b.x;
}

int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>t[i].x,t[i].id=i;
	sort(t+1,t+n+1,cmp);
	for(int i=1;i<=n;i++) cout<<t[i].id<<' ';
	cout<<'\n';
	for(int i=1;i<=n;i++) avg+=(double)t[i].x*(double)(n-i); //注意对于第i个人他的等待时间为t{i-1}*(n-i)
	//cout<<avg<<'\n';
	cout<<setprecision(2)<<fixed<<avg/(double)n; //保留两位小数
	return 0;
}

T5

/*
思路:
遍历n个彩票号码,
对于第i个号码,
遍历中奖号码,
记录相等的个数,
将对应的奖项获得数目更新即可。
*/
#include<bits/stdc++.h>
using namespace std;

int n;
int num[7]; //中奖号码
int p[1031][7]; //n个彩票号码
int tot[7]; //每个奖项的获得数目

int main(){
	cin>>n;
	for(int i=0;i<7;i++) cin>>num[i];
	for(int i=1;i<=n;i++){
		for(int j=0;j<7;j++) cin>>p[i][j];
		int cnt=0;
		for(int j=0;j<7;j++) //遍历中奖号码
			for(int k=0;k<7;k++) //遍历当前彩票号码
				if(p[i][k]==num[j]) cnt++; //记录相等个数
		tot[7-cnt]++; //更新获得奖项数目
	}
	for(int i=0;i<7;i++) cout<<tot[i]<<' ';
	return 0;
}

T6

/*
思路:
我们知道,一个满足第一个条件的首领,一定是所有这个品种牛中的第一个,同时它名单的右端点一定包含了这个品种的最后一头牛;
因此我们可以先找出字符序列中两种牛的第一个和最后一个。
同时我们又知道,一个满足第二个条件的首领,它的名单一定包含了另一个品种牛的首领;
因此我们遍历字符序列,若有一头牛满足他的名单包含另一品种牛的首领,则令答案累加。
同时需要注意可能漏掉两个品种的首领都满足第一个条件的情况,需要单独特判。
*/
#include<bits/stdc++.h>
using namespace std;

int n,ans,len;
char cow[200031];
int ed[200031];
int g,h,G,H;
bool gg,hh;

int main(){
	cin>>n>>(cow+1);
	len=strlen(cow+1);
	for(int i=1;i<=n;i++) cin>>ed[i];
	
	for(int i=1;i<=len;i++){ //找第一个
		if(cow[i]=='G'&&!g) g=i;
		if(cow[i]=='H'&&!h) h=i;	
	}
	for(int i=len;i>=1;i--){ //找最后一个
		if(cow[i]=='G'&&!G) G=i;
		if(cow[i]=='H'&&!H) H=i;
	}
	
	for(int i=1;i<=n;i++){
		if(cow[i]=='H'){ 
			if(ed[i]>=g&&i<=g&&ed[g]>=G){ //若它包含另一品种的首领
				ans++;
				if(i==h) hh=1; //标记
			}
		}
		else{
			if(ed[i]>=h&&i<=h&&ed[h]>=H){
				ans++;
				if(i==g) gg=1;
			}
		}
	}
	if(ed[h]>=H&&ed[g]>=G&&!gg&&!hh) ans++; //若两个品种的首领都满足第一个条件
	cout<<ans;
	return 0;
}

标签:std,Living,下标,17,int,&&,using,include,Dream
From: https://www.cnblogs.com/XOF-0-0/p/18062507

相关文章

  • Living-Dream 系列笔记 第14期
    本期主要讲解差分技巧。知识点我们令原数组为\(a_i\),则当且仅当\(d_i=a_i-a_{i-1}\)时,我们称\(d_i\)是\(a_i\)的差分数组。特别的,\(d_1=0\),\(d_{n+1}=-n\)。差分数组\(d_i\)有以下三个性质:\(d_i\)的前缀和数组为\(a_i\)。将\(a_{L\simR}\)这个区间统一加......
  • Living-Dream 系列笔记 第15期
    模拟赛爆炸祭。T1把所有连通块依次求出,若某个连通块的数量已经出现过,则说明它与以前的连通块属于同一星系,直接将星系大小加上连通块大小并取\(\max\);否则将星系数量\(+1\)。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,m;intans=-1e9,num,......
  • P3670 [USACO17OPEN] Bovine Genomics S 题解
    题意给定\(2\)组字符串,每组\(n\)个,每个字符串包含\(m\)个字符。我们称一个三元组\((i,j,k)\)是合法的,当且仅当第二组的每个字符串中下标为\((i,j,k)\)的字符拼成的字符串与第一组的每个字符串中下标为\((i,j,k)\)的字符拼成的字符串均不相等。现在需要你对于给定的......
  • Living-Dream 系列笔记 第11期
    本期主要讲解与上期相同内容(雾。例题T1在整个矩阵外加一圈\(0\),使得包围圈外的\(0\)形成一整个连通块。求出这个连通块并标记为\(1\),然后输出即可。#include<bits/stdc++.h>usingnamespacestd;intn;intdx[]={-1,0,1,0},dy[]={0,1,0,-1};inta[31][31],g[31][31];......
  • Living-Dream 系列笔记 第12期
    本期主要讲解一维前缀和技巧。知识点我们令\(a_i\)表示原数组的第\(i\)个元素,则\(sum_i\)表示\(a_i\)前\(i\)个元素之和,即:\[sum_i=\sum^{i}_{j=1}a_j\]我们知道,\(a\)数组前\(i\)个元素的和\(=\)前\(i-1\)个元素的和\(+a_i\)。于是便可得到\(sum\)数组的......
  • Living-Dream 系列笔记 第13期
    本期主要讲解二维前缀和。知识点我们令\(a_{i,j}\)表示原数组,则\(sum_{i,j}\)为\(a\)的二维前缀和数组。根据容斥原理,得到递推式:\[sum_{i,j}=sum_{i-1,j}+sum_{i,j-1}-sum_{i-1,j-1}+a_{i,j}\]二维前缀和适用于求静态矩阵的子矩阵元素和。若我需要求一个左上角坐标为......
  • Living-Dream 系列笔记 第10期
    本期主要讲解进阶\(\text{DFS}\)。知识点\(\text{DFS}\)求解连通块问题:定义:若一个点集中的所有点都能互达,且与集合外的点无法互达,则称此点集为一个连通块。考查方式:求连通块数量/大小/周长。例题T1在\(\text{DFS}\)函数中传入参数\(x\)和\(str\),分别表示......
  • P10217 [省选联考 2024] 季风题解
    考场上没写出来,火大,实际上这题放校内%你赛我肯定写的出来,可惜这是省选。实际上这题不难,主要是观察性质,接着拆柿子,然后就是有点难写,要写得好看有点考验代码构建能力和数学能力。我们考虑原题的每对\((x,y)\)都要满足\(|x|+|y|\lek\)而我们可以知道后面应该填的\((x,y)\)如......
  • Living-Dream 系列笔记 第8期
    本期主要讲解的与上期相同。例题T1上课的时候调这个题感觉要吐了\(qwq\)。。。首先读入\(n\)行字符串,可以采取忽略中间无关单词的方式来直接读取\(X\)和\(Y\)。将所有名字存入\(a\)数组,对\(a\)数组按字典序排序后就可以开始\(\text{DFS}\)了,这里建议使用next_pr......
  • Living-Dream 系列笔记 第9期
    模拟赛掉大分(悲T1板子,不讲。T2首先很明显这题是个去重全排列。和模板的区别就是加了一个\(sum\)参数记录目前已经放了几个苹果。当\(x=n+1\)时若\(sum=m\),则更新答案。同时加入一个剪枝:若在搜索过程中\(sum>m\),则直接return结束搜索。#include<bits/stdc++.h>usi......