T1T1

考试错误:无。

思路:

∵2x%m=1&&x<m;
   ∵2x%m=1;
   ∴(2x-1)%m=0;

   ∵x<m;
   ∴2x-1=m;
∴x=(m+1)/2;

代码:

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

T2T2

考试错误:暂时不知道哪有问题

思路:

这是一道模拟题,用逆向思维来求出吃不了草的天数,再用TT减去吃不了草的天数即可。

#include <bits/stdc++.h>
#define int unsigned long long
using namespace std;
const int N=1e5+50;
int d[N],b[N];
signed main(){
	freopen("cow.in","r",stdin);
	freopen("cow.out","w",stdout);
    int n,t;
    cin >> n >> t;
    int res=0,ans=0;
    for(int i=1;i<=n;i++){
        cin >> d[i] >> b[i];
        if(res>=d[i]) res+=b[i];
        else ans+=(d[i]-res-1),res=d[i]+b[i]-1;
    }
    int zero=0;
    ans+=min(zero,t-res);
    cout << t-ans;
}

T3T3

考试错误:暴力骗了6060分,没有发生错误。

思路:

11.用前缀和数组和后缀和数组辅助求和。

22.使用二分找出最后一个<=k<=k的数。

33.最后求出答案。

代码:

#include <bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N=1e5+50;
pair<int,int> f[N];
int pre[N],suf[N];
signed main(){
	freopen("cat.in","r",stdin);
	freopen("cat.out","w",stdout);
    int n;
    cin >> n;
    for(int i=1;i<=n;i++){
        cin >> f[i].y;
    }for(int i=1;i<=n;i++){
        cin >> f[i].x;
    }
    sort(&f[1],&f[n+1]);
	for(int i=1;i<=n;i++){
        pre[i]=pre[i-1]+f[i].x*f[i].y;
    }for(int i=n;i>=1;i--){
        suf[i]=suf[i+1]+f[i].y;
    }
    int q;
    cin >> q;
    while(q--){
        int k;
        cin >> k;
        int l=0,r=n;
        while(l<r){
            int mid=(l+r>>1)+1;
            if(f[mid].x<=k) l=mid;
            else r=mid-1;
        }
        cout << suf[l+1]*k+pre[l] << endl;
    }
}

T4T4

考试错误:没有时间了,所以没去做这道题,下次要提高做题速度。

思路:

后面自己做了一下,是一道模拟题,只需注意在处理退格键时要用一个栈,其他按题目要求来就行。

代码:

#include <bits/stdc++.h>
using namespace std;
vector<string> vcr,vcr2;
int main(){
	freopen("key.in","r",stdin);
	freopen("key.out","w",stdout); 
    string s;
    while(getline(cin,s)){
        if(s=="EOF") break;//结束
        if(s=="") continue;//多余行
        vector<char> t;
        for(int i=0;i<s.size();i++){
            if(s[i]=='<'&&t.size()) t.pop_back();//退格
            if(s[i]!='<') t.push_back(s[i]);//防止光标在第一位时误加的情况
        }
        string x;
        for(int i=0;i<t.size();i++) x=x+t[i];
        if(x.size()) vcr.push_back(x);//全是退格时的情况
    }while(getline(cin,s)){
        if(s=="EOF") break;
        if(s=="") continue;
        vector<char> t;
        for(int i=0;i<s.size();i++){
            if(s[i]=='<'&&t.size()) t.pop_back();
            if(s[i]!='<') t.push_back(s[i]);
        }
        string x;
        for(int i=0;i<t.size();i++) x=x+t[i];
        if(x.size()) vcr2.push_back(x);
    }
    double d;
    cin >> d;
    double cnt=0;
    for(int i=0;i<vcr.size()&&i<vcr2.size();i++){
        for(int j=0;j<vcr[i].size()&&j<vcr2[i].size();j++){
            if(vcr[i][j]==vcr2[i][j]){
            	cnt+=1;
			} 
        }
    }
	cout << (long long)((60/d*cnt)+0.5);
}

T6T6

考试错误:对模拟的运用还不够,没有看出是一道模拟题。

思路:

这是一道模拟题,用两个循环模拟奶牛向左和向右冲,随后在能冲出去的那一边加干草,如果两边都能冲出去,输出1-1

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
pair<int,int> a[N];
bool cmp(pair<int,int> a,pair<int,int> b){
	return a.second<b.second;
}
signed main(){
	freopen("cow.in","r",stdin);
	freopen("cow.out","w",stdout);
	int jd=0xffffffff;
	int n,b;
	cin >> n >> b;
	for(int i=1;i<=n;i++){
		cin >> a[i].first >> a[i].second;
	}
	sort(a+1,a+n+1,cmp);
	if(b>a[n].second||b<a[1].second){
		cout << -1;
		return 0;
	}
    int q=0,w=0,l=0,r=0;
	for(int i=1;i<=n;i++){
		if(a[i].second>b){
			w=i,q=i-1;
			break;
		}
	}
    l=q,r=w;
	while(l>=1){
		while(a[r].second-a[l].second>a[r].first&&r<=n){
			r++;
		}
		if(r>n) break;
		jd=min(jd,a[r].second-a[l].second-a[l].first);
        l--;
	}
	l=q,r=w;
	while(r<=n){
		while(a[r].second-a[l].second>a[l].first&&l>=1){
			l--;
		}
		if(l<1) break;
		jd=min(jd,a[r].second-a[l].second-a[r].first);
		r++;
	}
	if(jd==0xffffffff) cout << -1;
	else cout << max(jd,0ll);
	return 0;
}