第三周学习记录

上周周赛

在这里插入图片描述
这道题我刚看到的时候以为它想让我用高精度QAQ。然后好不容易把高精度写出来了意识到它范围超了似乎要用动态数组QAQ,然后我改了半天越改越错。。。遂放弃QAQ

事实上它的正解是同余定理QAQ

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int a,b,ans=1;
	cin>>a>>b;
	for(int i=1;i<=b;i++)
		ans=(ans*(a%7))%7;	
	if(ans==1)	printf("Monday");
	if(ans==2)	printf("Tuesday");
	if(ans==3)	printf("Wednesday");
	if(ans==4)	printf("Thursday");
	if(ans==5)	printf("Friday");
	if(ans==6)	printf("Saturday");
	if(ans==0)	printf("Sunday");
	return 0;
}

在这里插入图片描述
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;

bool runnian(int i)
{
	if((i%4==0 && i%100!=0)||i%400==0)	return 1;
	else	return 0;
}
int yue(int y,int m)
{
	if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)	return 31;
	else if(m==4||m==6||m==9||m==11)	return 30;
	else
	{
		if(runnian(y)==1)	return 29;
		else	return 28;
	}
}
int main()
{
	int sy,sm,sd;
	int ey,em,ed;
	int ans=0;
	cin>>sy>>sm>>sd;
	cin>>ey>>em>>ed;
	for(int i=sy;i<ey;i++)
	{
		if(runnian(i)==1)	ans+=366;
		else ans+=365;
	}
	ans+=ed;
	ans-=sd;
	for(int i=1;i<em;i++)
	{
		ans+=yue(ey,i);
	}
	for(int i=1;i<sm;i++)
	{
		ans-=yue(sy,i);
	}
	cout<<ans;
	return 0;
}

在这里插入图片描述
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;

const long long N=9999999;
long long a[N]={},d[N]={},sum[N]={},l[N]={};
int main()
{
	long long n,min=N,q;
	cin>>n;
	for(long long i=0;i<n;i++){
		cin>>a[i]>>d[i];
	}
	long long L=0;
	for(long long i=0;i<n;i++){
		L+=d[i];
	}
	//cout<<L<<endl;
	for(long long i=0;i<n;i++){
		l[i]=l[i-1]+d[i-1];
	}
	
	for(long long i=0;i<n;i++){
		long long s=0;
		for(long long j=0;j<n;j++){
			long long p=abs(l[i]-l[j]);
			s=p<(L-p)?p:L-p;
			//cout<<"^"<<s<<" ";
			sum[i]+=a[j]*s;
		}
		//cout<<"@"<<sum[i]<<" ";
	}
	for(long long i=0;i<n;i++){
		if(sum[i]<min){
			min=sum[i];
			q=i;
		}
	}
	cout<<q<<","<<min;
	return 0;
}

在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int a,b,n;
	cin>>a>>b>>n;
	int sum=a+b;
	for(int i=1;i<=n;i++)
		sum=sum*3-a-b;
	printf("%d",sum);
	
	return 0;
} 

在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;

int a[1002][1002]={0};
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
		}
	}
	int x1,y1,x2,y2;
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(a[i][j]==0){
				x1=i;
				y1=j;
				break;
			}
		}
		if(x1!=0)	break;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(a[i][j]==0){
				x2=i;
				y2=j;
			}
		}
	}
	int ans=(x2-x1-1)*(y2-y1-1);
	cout<<ans;
	return 0;
} 

在这里插入图片描述
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;

char s[1020000];

void sai(int x,int y) 
{
	int n=0,m=0;
	for(int i=0;i<y;i++)
	{
		if(s[i]=='W')	n++;
		if(s[i]=='L')	m++;
		if((n>=x||m>=x)&&abs(m-n)>=2)
		{
			cout<<n<<":"<<m<<endl;
			n=0;m=0;
		}
	}
	cout<<n<<":"<<m<<endl;
}
int main()
{
	char a;
	int n=0;
	while(cin>>a&&a!='E')
		s[n++]=a;
	sai(11,n);
	printf("\n");
	sai(21,n);
	return 0;
} 

关于前缀和和差分的练习题

在这里插入图片描述
在这里插入图片描述
题看起来好麻烦QAQ
事实上可以通过计算每一站的重复次数来判断这一站要不要买卡,最后再将各个站所花费的费用加起来就好QWQ

#include <bits/stdc++.h>
using namespace std;

const long long N=1e5+21;
long long A[N]={},B[N]={},C[N]={},M[N]={};
long long ci[N]={},c[N]={},f[N]={};
int main()
{
	long long n,m,fee=0;
	cin>>n>>m;
	for(long long i=1;i<=m;i++)
		cin>>M[i];
	for(long long i=1;i<=n-1;i++)
		cin>>A[i]>>B[i]>>C[i];
	for(long long i=1;i<=m-1;i++){
		c[min(M[i],M[i+1])]++;
		c[max(M[i],M[i+1])]--;
	}	
	for(long long i=1;i<=n-1;i++){
		ci[i]=ci[i-1]+c[i];//先使用差分算每一站的次数;
	}	
	for(long long i=1;i<=n-1;i++){
		if(A[i]*ci[i]>B[i]*ci[i]+C[i])	f[i]=B[i]*ci[i]+C[i];//比较要不要办卡
		else	f[i]=A[i]*ci[i];
	}
	for(int i=1;i<=n-1;i++)	
		fee+=f[i];//加起来QWQ
	cout<<fee;
	return 0;
}

在这里插入图片描述

在这里插入图片描述
来自AI的翻译QAQ(让我们谢谢AI QAQ
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这道题感觉和A的解法好像。。。
先各自找到身高最高的猩猩以及重复次数最多的方块,然后相乘再相加QAQ

#include <bits/stdc++.h>
using namespace std;

const long long N=2e5+10;
long long a[N]={0},b1[N]={0};

bool cmp(long long A,long long B)//sort函数要用;
{
	return A>B;
}
int main()
{
	long long t;
	cin>>t;
	for(long long i=1;i<=t;i++)
	{
		long long n,m,k,ans=0;
		cin>>n>>m>>k;
		long long w;
		cin>>w;
		long long c[n+2][m+2]={};//
		for(long long j=1;j<=N;j++){//每次运算完要重新把他们都变成0;
			a[j]=0;b1[j]=0;
		}
		for(long long j=1;j<=n-k+1;j++){
			for(long long jj=1;jj<=m-k+1;jj++){
				c[j][jj]=0;
			}
		}
		for(long long j=1;j<=w;j++)
			cin>>a[j];
		for(long long j=1;j<=n-k+1;j++){
			for(long long jj=1;jj<=m-k+1;jj++){
				c[j][jj]++;
				c[j+k][jj]--;
				c[j][jj+k]--;
				c[j+k][jj+k]++;
			}
		}
		for(long long j=1;j<=n;j++){
			for(long long jj=1;jj<=m;jj++){
				c[j][jj]+=c[j-1][jj]+c[j][jj-1]-c[j-1][jj-1];
			}
		}
		long long f=1;	
		for(long long j=1;j<=n;j++){
			for(long long jj=1;jj<=m;jj++){
				b1[f++]=c[j][jj];//二维差分计算每个格子出现的次数;
			}
		}
		sort(b1+1,b1+f+1,cmp);
		sort(a+1,a+w+1,cmp);
		for(long long j=1;j<=w;j++){
			ans+=a[j]*b1[j];
		}
		cout<<ans<<endl;
	}
	return 0;
}

不过还有一点需要注意一下QAQ:
数据范围是到2e5,如果直接把数组c设成c[N][N]的话会变成4e10,就超了(一般最多是4e8(善良的石宇学长告诉我的QWQ))

在这里插入图片描述
在这里插入图片描述
依然是来自AI的翻译QAQ:
在这里插入图片描述
在这里插入图片描述
这道题的思路也好有趣QWQ
善良的石宇学长讲完之后我似乎懂了他为什么要这么干。。。。。。
但让我说我是绝对说不出来的。。。。。。
有一种十分奇怪的美感。。。。。。(不是

#include <bits/stdc++.h>
using namespace std;

const long long N=1e5+12;
long long a[N]={0},c[N]={0};
int main()
{
	long long t;
	cin>>t;
	for(long long i=1;i<=t;i++)
	{
		long long n,d,k;
		cin>>n>>d>>k;
		for(long long i=1;i<=n;i++){
			a[i]=0;
			c[i]=0;
		}
		for(long long j=1;j<=k;j++){
			long long li,ri;
			cin>>li>>ri;
			c[max(1LL,li-d+1)]++;
			c[ri+1]--;
		}
		for(long long j=1;j<=n;j++){
			a[j]=a[j-1]+c[j];
		}
		long long max=0,ans1=0;
		for(long long j=1;j<=n-d+1;j++){
			if(a[j]>max){
				max=a[j];
				ans1=j;
			}
		}
		long long min=1e5+12,ans2=0;
		for(long long j=1;j<=n-d+1;j++){
			if(a[j]<min){
				min=a[j];
				ans2=j;
			}
		}
		cout<<ans1<<" "<<ans2<<endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值