T1T1

考试错误:无,一遍ACAC的。

思路: 11.特判:n = 1,2时需要进行特判。 22.如果0101数量不相等(全一样输出2),输出133.否则输出2(特判另算 )。

代码:

#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
signed main(){
    freopen("change.in","r",stdin);
    freopen("change.out","w",stdout);
	int n;
	cin >> n;
    string s;
    cin >> s;
    if(n==1){
    	cout << 0;	
    	return 0;
	} 
    else if(n==2){
    	if(s[0]==s[1]) cout << 0;
    	else cout << -1;
    	return 0;
	}
    int cnt0=0,cnt1=0;
    for(int i=0;i<s.size();i++){
        if(s[i]=='0') cnt0++;
        else cnt1++;
    }
    if(cnt0==cnt1) cout << 2;
    else if(cnt1==n||cnt0==n) cout << 0;
    else cout << 1;
}

T2T2

错误原因:完全不会。

思路:

一道大模拟,我们先要把时间和路程分别加入到两个栈中并排序,随后将时间转化成路程,最后再算出答案即可。

代码:

#include <bits/stdc++.h>
#define int double
using namespace std;
vector<int> tt,dd;
double v=1;
signed main(){
    freopen("snow.in","r",stdin);
    freopen("snow.out","w",stdout);
    int n;
    cin >> n;
    for(int i=1;i<=n;i++){
        char c;
        int x;
        cin >> c >> x;
        if(c=='T') tt.push_back(x);
        else dd.push_back(x);
    }
    int xt=0,xd=0;
    double T=0,D=0;
    sort(tt.begin(),tt.end());
    sort(dd.begin(),dd.end());
    tt.push_back(2e9);
    dd.push_back(2e9);
    while(xt<tt.size()-1||xd<dd.size()-1){
        double s=1/v;
        v++;
        double dist=D+(tt[xt]-T)*s;
        if(dist<dd[xd]){
            D=dist,T=tt[xt];
            xt++;
        }
        else{
            T=T+(dd[xd]-D)/s;
            D=dd[xd];
            xd++;
        }
    }
    T+=(1000-D)*v;
    cout << (long long)(T+0.5);
}

T3T3

考试错误:错误的按DiDi排序,导致错误。

思路:

11.排序(cmp:a.t×b.d<a.d×b.t)。

22.用一个后缀和数组ss储存每次赶牛时剩下牛会吃多少草。

33.forfor循环从11-n1n-1,每次用a[i]*s[i+1],把乘积加入到sum里面。

44.输出sum

代码:

#include<bits/stdc++.h>
using namespace std;
struct str{
    long long t,d;
};
str a[200005];
long long s[200005];
bool cmp(str x,str y){
    return x.t*y.d<x.d*y.t;
}
int main(){
    freopen("cow.in","r",stdin);
    freopen("cow.out","w",stdout);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].t>>a[i].d;
    }
    sort(a+1,a+1+n,cmp);
    long long sum=0,k=0;
    for(int i=1;i<=n;i++){
        sum+=a[i].d*k;
        k+=2*a[i].t;
    }
    cout<<sum;
    return 0;
}

T4T4

考试错误:骗分的,没有发生错误。

思路:

11.输入。

22.枚举两个数组,并获取字典序。

33.用归并的思想去组合数字,注意要按字典序。

44.输出。

代码:

#include<bits/stdc++.h>
using namespace std;
int cmp(vector<int> a,int ida,vector<int> b,int idb){
	int len1=a.size(),len2=b.size();
	while(ida<len1&&idb<len2) {
		if(a[ida]!=b[idb]) return a[ida]>b[idb];
		ida++,idb++;
	}
	if(ida<len1) return 1;
	else return 0;
}
vector<int> get(vector<int> a,int k){
	int n=a.size();
	if(n<=k)return a;	
	int t=n-k; 
	vector<int> stk;
	for(int i=0;i<n;i++){
		while(stk.size()>0&&stk.back()<a[i]&&t>0){
			stk.pop_back();
			t--;
		}
		if(stk.size()<k)stk.push_back(a[i]);
		else t--;
	}
	return stk;
}
vector<int> merge(vector<int> a,vector<int> b){
	int len1=a.size(),len2=b.size();
	vector<int> res;
	int i=0,j=0;
	while(i<len1&&j<len2) {
		if(a[i]>b[j]) res.push_back(a[i++]);
		else if(a[i]<b[j]) res.push_back(b[j++]);
		else{
			if(cmp(a,i,b,j)>0) res.push_back(a[i++]);
			else res.push_back(b[j++]);
		}
	}
	while(i<len1) res.push_back(a[i++]);
	while(j<len2) res.push_back(b[j++]);
	return res;
}
int main(){
	freopen("big.in","r",stdin);
	freopen("big.out","w",stdout);
	int n,m,k;
	cin >> n >> m >> k;
	vector<int> a,b;
	for(int i=1;i<=n;i++) {
		int x;
		cin>>x;
		a.push_back(x);
	}
	for(int i=1;i<=m;i++) {
		int x;
		cin>>x;
		b.push_back(x);
	}
	vector<int> ans(k,0);
	for(int i=0;i<=k;i++) {
		int len1=i,len2=k-i;
		vector<int> tmp1=get(a,len1); 
		vector<int> tmp2=get(b,len2);
		vector<int> res=merge(tmp1,tmp2);
		if(res.size()==k&&cmp(res,0,ans,0)>0) ans=res;
	}
	for(auto x:ans){
		cout<<x;
	}
}

T5T5

考试错误:对dijkstra算法理解的不深刻,导致没有做出来。

思路:

模板题,只改了一两句,但是很难想出怎么改。(具体改法见代码)。

易错点:在赋值distdist数组时要用循环赋值,不能直接memsetmemset(我也不知道为啥,反正改了AC ,不改RE)。

代码:

#include <bits/stdc++.h>  
using namespace std;  
int arr[2005][2005],n,m,e,s;
double dist[2005];
bool v[2005];
void dijkstra(){  
    for(int i=1;i<=n;i++) dist[i]=0x3f3f3f3f;
    dist[s]=100; 
    for(int i=1;i<=n;i++){
        int x=-1;
        for (int j=1;j<=n;j++){  
            if(!v[j]&&(x==-1||dist[j]<dist[x])) x=j;
        }  
        v[x]=1;
        for(int y=1;y<=n;y++){ 
            if(arr[x][y]<200&&dist[x]/(1-arr[x][y]*0.01)<dist[y]){
                dist[y]=dist[x]/(1-arr[x][y]*0.01);
            }
        }  
    } 
}  
int main(){  
    freopen("water.in","r",stdin);
	freopen("water.out","w",stdout);
    cin >> n >> m;
    memset(arr,0x3f,sizeof(arr));  
    for(;m--;){
        int x,y,z;  
        cin >> x >> y >> z;
        arr[x][y]=z;
        arr[y][x]=z;
    }
    cin >> e >> s; 
    dijkstra();
    printf("%.8lf",dist[e]);  
}

T6T6

考试错误:DPDP题,没做出来。

DPDP思路:

11.每遇到一个oo,我们就统计这个oo前面vvvv的数量和后面vvvv的数量,这个oo能组成wowwow的数量就是前面的vvvv数×后面的vvvv数。

22.所以我们只需用两个变量存储这个oo前面vvvv的数量和后面vvvv的数在相加即可。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
	freopen("wow.in","r",stdin);
	freopen("wow.out","w",stdout);
	string s;
	cin >> s;
	long long wow1=0,wow2=0,wow3=0;
	for(int i=0;i<s.size();i++){
		if(s[i]=='o')wow2+=wow1;
		else if(s[i-1]=='v'){
			wow3+=wow2;
			wow1++;
		}
	}
	cout << wow3;
	return 0;
}