题目传送门

A 小田的同余

B 小田的奶牛要饿坏啦!!

C 小田喂猫

D 小田的打字练习

E 小田切蛋糕

F 小田想困住奶牛

T1. 小田的同余😄

思路❤️

要开long long,直接输出符合条件的“(m+1)/2”就可以了

代码🎉️

#include<bits/stdc++.h>
using namespace std;
int main(){
	freopen("mod.in","r",stdin);
	freopen("mod.out","w",stdout);
	long long m;
	cin>>m;
	cout<<(m+1)/2;
}

T2. 小田的奶牛要饿坏啦!!

思路

我们发现绝对不能枚举天数,所以我们可以在输入时进行模拟,算出能吃几天

代码🎉️

#include<bits/stdc++.h>
using namespace std;
long long n,t,q=-1,z=-1,l=0;
struct P{
	long long d,b;
}a[100010];
long long c;
int main(){
	freopen("cow.in","r",stdin);
	freopen("cow.out","w",stdout);
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>t;
	for(int i=1;i<=n;i++){
		cin>>a[i].d>>a[i].b;
		if(l)continue;
		if(a[i].d>z)q=-1,z=-1;
		c+=a[i].b;
		if(q==-1)q=a[i].d;
		if(z!=-1)z=z+a[i].b;
		if(z==-1)z=a[i].d+a[i].b-1;
		if(z>t)c-=(z-t),l=1;
	}
	cout<<c;
}

T3小田喂猫😥🤕

错的点😱

1.我用了暴力,拿了50分,以后要多多优化

👌思路

用们可以发现这一段可以分成两段,一段是小于k的,用原价是,另一段大于k,价值用k,数量用原本,然后我们可以用两个前缀和辅助

🍗代码

#include<bits/stdc++.h>
using namespace std;
long long  n,q,k;
struct P{
	long long  a,b,c,d;
}a[100010];
bool cmp(P a,P b){
	return a.b<=b.b;
}
int main(){
	freopen("cat.in","r",stdin);
	freopen("cat.out","w",stdout);
	cin>>n;
	for(long  long  i=1;i<=n;i++)cin>>a[i].a;
	for(long  long  i=1;i<=n;i++)cin>>a[i].b;
	sort(a+1,a+1+n,cmp);
	for(long long i=1;i<=n;i++)a[i].c=a[i-1].c+a[i].a*a[i].b;
	for(long long i=n;i>=1;i--)a[i].d=a[i+1].d+a[i].a;
	cin>>q;
	a[0].b=-100;
	while(q--){
		cin>>k;
		long long l=0,r=n;
		while(l<r){
			long long m=(l+r+1)>>1;
			if(a[m].b<=k)l=m;
			else r=m-1;
		}
		cout<<a[l].c+k*a[l+1].d<<"\n";
		
	}
}

T4小田的打字练习😎😏

👾错的点

1.我直接骗分的,以后有时间这种大模拟一定要写

🤩思路

这是一道模拟,我么可以用循环处理模板与小田的,然后再对比,把一样的字符加到计数变量里,最后算速度

代码🙃

#include <bits/stdc++.h>
using namespace std;
vector<string> mb,xt;
int main(){
	freopen("key.in","r",stdin);
	freopen("key.out","w",stdout); 
	string sr;
	while(getline(cin,sr)&&sr!="EOF"){
		if(sr=="")continue;
		vector<char>cz;
		for(int i=0;i<sr.size();i++){
			if(sr[i]=='<'&&cz.size()) cz.pop_back();
			if(sr[i]!='<')cz.push_back(sr[i]);
		}
		string cl;
		for(int i=0;i<cz.size();i++) cl+=cz[i];
		if(cl.size()!=0)mb.push_back(cl);
	}
	while(getline(cin,sr)&&sr!="EOF"){
		if(sr=="")continue;
		vector<char>cz;
		for(int i=0;i<sr.size();i++){
			if(sr[i]=='<'&&cz.size())cz.pop_back();
			if(sr[i]!='<')cz.push_back(sr[i]);
		}
		string cl;
		for(int i=0;i<cz.size();i++) cl+=cz[i];
		if(cl.size()!=0)xt.push_back(cl);
	}
	double sj,js=0;
	cin>>sj;
	for(int i=0;i<mb.size()&&i<xt.size();i++)for(int j=0;j<mb[i].size()&&j<xt[i].size();j++)if(mb[i][j]==xt[i][j])js++;
	cout<<(long long)((60/sj*js)+0.5);
}

T5小田切蛋糕😴🤐

错的地方😤

1.纯骗分,以后要多思考

思路👿

我们可以枚举个数,再计算是否可行,所以可以用前缀和写,但会超时,所以还要二分来找个数

代码🎁

#include<bits/stdc++.h>
using namespace std;
int d[5555][5555],s[5555][5555],a,b,r,c,h;
int ch(int x){
	int ro=0,c1=0;
	for(int i=1;i<=r;i++){
		int co=0,c2=0;
		for(int j=1;j<=c;j++){
			int t=s[i][j]-s[i][co]-s[ro][j]+s[ro][co];
			if(t>=x)co=j,c2++;
			if(c2==b){c1++,ro=i;break;}
		}
		if(c1==a)return 1;
	}
	return 0;
}
int main(){
	freopen("cake.in","r",stdin);
	freopen("cake.out","w",stdout);
	cin>>r>>c>>a>>b;
	for(int i=1;i<=r;i++){
		for(int j=1;j<=c;j++){
			cin>>d[i][j];
			s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+d[i][j];
			if(i==r&&j==c)h=s[i][j];
		}
	}
	int l=0,r=h;
	while(l<r){
		int m=(l+r+1)>>1;
		if(ch(m))l=m;
		else r=m-1;
	}
	cout<<l;
}

T6小田想困住奶牛😑👹

错的点💀

1.直接输出了-1,以后不能只骗分,要多打草稿

思路😜

我么可以用两个循环,一个奶牛向左冲,另一个向右冲,向左冲需要尽量向右走,向右冲需要尽量向左走,然后算需要的草,但如果冲出边界,那么结束循环

😃代码

#include<bits/stdc++.h>
using namespace std;
struct P{
	int d,w;
}a[100010];
bool cmp(P a,P b){
	return a.w<b.w;
}
int main(){
	freopen("cow.in","r",stdin);
	freopen("cow.out","w",stdout);
	int n,m,p=1,dd,dx,l=dx,r=dd;
	int an=1000000000;
	cin>>n>>m;
	for(int i=1;i<=n;i++){cin>>a[i].d>>a[i].w;}
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=n;i++) 
	if(m<a[1].w||m>a[n].w){cout<<-1;return 0;}
	for(int i=1;i<=n;i++)if(p&&a[i].w>m)dd=i,dx=i-1,p=0;
	l=dx,r=dd;
	while(l>=1){
		while(a[r].w-a[l].w>a[r].d&&r<=n)r++;
		if(r>n)break;
		an=min(an,a[r].w-a[l].w-a[l].d);
		l--;
	}
	l=dx,r=dd;
	while(r<=n){
		while(a[r].w-a[l].w>a[l].d&&l>=1)l--;
		if(l<1)break;
		an=min(an,a[r].w-a[l].w-a[r].d);
		r++;
	}

	if(an==1000000000)cout<<-1;
	else cout<<max(an,0);
}