A.单词接龙

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

const int N = 1e5 + 5;

int n, m, d[N], st[N];
vector<int> e[N];

void toposort() {
    queue<int> q;
    for (int i = 1; i <= n; i++) {
        st[i] = -1;
        if (!d[i]) {
            st[i] = 0;
            q.push(i);
        }
    }
    while (!q.empty()) {
        int x = q.front();
        q.pop();
        for (int y : e[x]) {    
            if (~st[y]) continue;
            if (st[x] == 0) {
                st[y] = 1;
                q.push(y);
            } else {
                d[y]--;
                if (!d[y]) {
                    st[y] = 0;
                    q.push(y);
                }
            }
        }
    }
}

int main() {
    cin.tie(0)->sync_with_stdio(false);
    cin >> n >> m;
    for (int i = 0; i < m; i++) {
        int x, y;
        cin >> x >> y;
        e[y].push_back(x);
        d[x]++;
    }
    toposort();
    if (st[1] == 1)
        cout << "Alice";
    else if (st[1] == 0)
        cout << "Bob";
    else
        cout << "Draw";
    return 0;
}

B.跳跃

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
void solve()
{
	string s;
	cin>>s;
	int n=s.size();
	map<char,vector<int>>lay;
	for(int i=0;i<n;i++)
	{
		lay[s[i]].push_back(i);
	}
	int d=(s[0]<s[n-1])?1:-1;
	//看是递增还是递减序列,最小的代价就是起点减去终点的绝对值 
	vector<int>ans;
	for(char c=s[0];c!=s[n-1]+d;c+=d)
	{
		for(auto now:lay[c])
		{
			ans.push_back(now);
		}//每次找当前点紧邻的下一个点是否存在,从大到小找,或从小到大找 
	}
	int cost=0;
	for(int i=1;i<ans.size();i++)
	{
		cost+=abs(s[ans[i]]-s[ans[i-1]]);
	}
	cout<<cost<<" "<<ans.size()<<endl;
}
signed main()
{
	cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
}

C。关于不知名的幽夜净土守护者在风起地大战QQ人保卫蒙德这档事

整活题目,请勿当真(小声)

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define de(x) cout << x << " ";
#define sf(x) scanf("%d", &x);
#define Pu puts("");
#define int long long
const int N = 1e5 + 10;
struct E {
    int h, p;
} e[N];
int n, m, k;
bool cmp(E a, E b) {
    if (a.p == b.p)
        return a.h < b.h;
    return a.p < b.p;
}
signed main(){
    int T;
    cin >> T;
    while (T--) {
        cin >> n >> k;
        for (int i = 1; i <= n; i++) {
            sf(e[i].h);
        }
        for (int i = 1; i <= n; i++) {
            sf(e[i].p);
        }
        sort(e + 1, e + n + 1, cmp);
        int damage = k;
        int id = 1;
        while (id <= n && k > 0) {
            while (damage >= e[id].h && id <= n)
                id++;
            if (id > n)
                break;
            k -= e[id].p;
            if (k > 0)
                damage += k;
        }

        int f = 1;
        for (int i = 1; i <= n; i++) {
            if (damage < e[i].h) {
                f = 0;
                break;
            }
        }
        if (f == 1)
            puts("YES");
        else
            puts("NO");
    }
}

D.石堆

#include<iostream>
#include<vector>
#include<stdlib.h>
#include<time.h> 
using namespace std;
const int N=2e5+10,mod=1e9+7;
#define int long long

int t,n;
int a[N],b[N];

signed main(){
//	freopen("10.in","r",stdin);
//	freopen("10.out","w+",stdout);
	cin >> t;
	while(t--){
		cin >> n;
		for(int i=1;i<=n;i++) cin >> a[i];
		int l = 1,r = mod;
		while(l < r){
			int mid = (l+r+1)/2;
			vector<int> f(a,a+n+1);
			int flag = 0;
			int m = 0;
			for(int i=n;i>=3;i--){
				int p = min(a[i]/3,max((f[i]-mid)/3,m));
				f[i-2] += 2*p;
				f[i-1] += p;
			}
			for(int i=1;i<=n;i++)
				if(f[i] < mid) flag = 1;
			if(flag == 0) l = mid;
			else r = mid - 1;
		}
		cout << l << endl;
	}
}

E.神奇的会说话的小球

#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define INF 0x3f3f3f3f
const int N=110;
bool vis[N][N];
int a[N][N];
int n,m;
int mx,my;
int ans=0;
int dx[4]={0,1,-1,0};
int dy[4]={1,0,0,-1};
void dfs(int x,int y,int l)
{
	ans=max(ans,l);
//	cout<<"**"<<ans<<endl;
	for(int i=0;i<4;i++)
	{
		int tx,ty;
		tx=x+dx[i];
		ty=y+dy[i];
		if(tx>=1&&ty>=1&&tx<=n&&ty<=m&&!vis[tx][ty]&&a[tx][ty]<a[x][y])
		{
			vis[tx][ty]=1;
			dfs(tx,ty,l+1);
			vis[tx][ty]=0;
		}
	}
	return ;
}
void solve()
{
	cin>>n>>m;
	int maxx=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			cin>>a[i][j];
			if(a[i][j]>=maxx)
			{
				maxx=a[i][j];
				mx=i,my=j;
			}
		}
	int res=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			dfs(i,j,1);
			res=max(res,ans);
		}
	cout<<res<<endl;	
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
   	int t;
   	t=1;
//	cin>>t;
	while(t--)
	{
		solve();
	 } 
    return 0;
}

F.决定就是你了 皮卡丘

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int m1,m2,n;
int f[N][N];
void solve(){
	cin>>m1>>m2>>n;
	m2--;
	for(int i=1;i<=n;i++){
		int v1,v2;
		cin>>v1>>v2;
		for(int j=m1;j>=v1;j--){
			for(int k=m2;k>=v2;k--){
				f[j][k]=max(f[j][k],f[j-v1][k-v2]+1);
			}
		}
	}
	cout<<f[m1][m2]<<" ";
	for(int k=0;k<=m2;k++)
		if(f[m1][k]==f[m1][m2]){
			cout<<m2-k+1<<endl;
			return;
		}
}
int main(){
	int Test=1;
//	cin>>Test;
	for(int i=1;i<=Test;i++){
		solve();
	}
}

G.一道简单的面试题

#include<bits/stdc++.h>
using namespace std;
int n,k,a[7],b[7],p[7];
bool f=1,u[7];
void dfs(int s){
    if(s==k+1){
        if(f)
            for(int i=1;i<=k;i++)
                printf("%d ",p[i]);
        f=0;
        return;
    }
    //边界
    for(int i=1;i<=n;i++)
        if(a[i]-b[s]>=0&&!u[i]){
            p[s]=i,u[i]=1;
            dfs(s+1);
            u[i]=0;
        }
    return;
}
int main(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
        scanf("%d",a+i);
    for(int i=1;i<=k;i++)
        scanf("%d",b+i);
    dfs(1);
    if(f)
        puts("-1");
    return 0;
}

H.数学题

#include <iostream>
#include <climits>
#include <string.h>
#include <string>
#include <stdio.h>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <list>
#include <stack>
#include <algorithm>
#include <math.h>
#include <cctype>
#include <stdlib.h>
#include <unordered_map>
#define INTINF 0x3f3f3f3f
#define LLINF  0x3f3f3f3f3f3f3f3f
#define N 2000010
#define rep(i , a , b) for(int i=(a) ; i <= (b) ; i++)
#define dwn(i , a , b) for(int i=(a) ; i >= (b) ; i--)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
inline ll read(){ll s=0,f=1;char c=getchar();for(;c<'0'||c>'9';c=getchar()) f=-1;for(;c>='0'&&c<='9';c=getchar()){s=s*10+c-'0';}return s*f;}

int n;
int l,r,x,y;
/*
gcd(a,b)=x,lcm(a,b)=y;
x*y=a*b

*/
void solve()
{
    cin>>l>>r>>x>>y;
    if(y%x)
    {
        cout<<"0\n";
        return;
    }
    int ans=0;
    int n=y/x;
    for(int a=1;a*a<=n;a++)
    {
        if(n%a==0)
        {
            int b=n/a;
            if(b*x>=l&&b*x<=r&&a*x>=l&&a*x<=r&&__gcd(a,b)==1)
            {
                if(a!=b) ans++;
                ans++; 
            }
        }
    }
    cout<<ans<<'\n';
}
int main()
{
    int t=1;
    while(t--)
    {
        solve();
    }
    return 0;
}

I.双圆舞

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>

using namespace std;

const  int  INF =  0x3f3f3f3f;

struct bian
{
    double w;
    int z;
    bool operator < (const bian &other) const
    {
        return w > other.w;
    }
};
int read() {
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    return x*f;
}
long long ans = 1;
int n;

int main ()
{
    ios::sync_with_stdio(false);
    cin>>n;
    long long t1 = 1 ;
    long long t2 = 1;
    for (int i = 1 ; i <= n/2-1; i++ )
    {
        t1*=i;
    }
    for (int i = n/2 + 1 ; i <= n ; i++ )
    {
        ans*=i;
    }
    ans = (ans * t1 )/(n);
    cout<<ans<<"\n";
    return 0 ;
}

J.交换序列

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
int n,m,a[maxn],x,b[maxn],k;
int main()
{
	int t; cin >> t;
	while( t-- )
	{
		cin >> n >> k;
		int ans = 1e9,ok=1;
		for(int i=1;i<=n;i++)
		{
			cin >> a[i];
			if( a[i]<a[i-1] )	ok=0;
		}
		if( ok ){ cout << 0 << endl; continue; }
		for(int i=1;i<=n;i++)
		{
			b[i]=k;
			for(int j=1;j<=n;j++)
				if( j!=i )	b[j]=a[j];
			sort( b+1,b+1+n );//最终的序列
			int temp = 0,now = k,flag=1;
			for(int j=1;j<=n;j++) 
			{
				if( a[j]==b[j] )	continue;
				else//不相等要交换 
				{
					if( a[j]<=now )	flag=0;//要交换却反而不能交换 
					else//可以交换啊
					{
						temp++;
						if( b[j-1]>now )	flag = 0;//需要保证交换后是大于之前的数字的 
						now = a[j];	
					}
				}
				if( flag == 0 )	break; 
			}
			if( flag )	ans = min( ans,temp );
		}
		if( ans==1e9 )	ans=-1;
		cout << ans << endl;
	}
}

K.品尝

#include<bits/stdc++.h>

typedef long long ll;
const int maxn=1e7+10;
const int mod=1e9+7;
using namespace std;
int ans=-233333333,n,m,a,sum[maxn];
deque<int>q;

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a);
        sum[i]=sum[i-1]+a;
    }
    q.push_back(0);
    for(int i=1;i<=n;i++)
    {
        while(q.front()+m<i)
            q.pop_front();
        ans=max(ans,sum[i]-sum[q.front()]);
        while(!q.empty()&&sum[q.back()]>=sum[i])
            q.pop_back();
        q.push_back(i);
    }
    printf("%d\n",ans);
    return 0;
}

L.数组的MEX

#include <bits/stdc++.h>
using namespace std ; 
const int N = 1e6 + 10 ; 
#define endl '\n' ; 
#define int long long 
typedef pair<int,int> PII ;  
int s[N] , sum[N] ; 
void solve() {
    int n; cin >> n;
    for(int i = 0 ; i<= n; i++) s[i] = 0 ; 
    for(int i = 0 ;i < n ;i ++)
    {
        int x ; cin >> x;  
        s[x] ++ ; 
    }
    sum[0] = s[0] ; 
    for(int i = 1 ;i <= n ; i++) sum[i] = sum[i-1] + s[i] ; 
    int last = 0 ; 
    int i ; 
    
    priority_queue<int> q ; 
    for( i = 0 ; i<=n ; i ++)
    {
        if(i == 0 )
        {
            cout << s[i] << " " ; 
        }
        else{
            if(sum[i-1] < i)
            {
                break ; 
            }
            int t = q.top() ; 
            q.pop() ; 
            last +=  i-1 - t ; 
            
            cout << last + s[i] << " " ; 
        }
        for(int j = 0 ; j < s[i] ; j ++) q.push(i) ; 
    }
    for(int j = 0 ; j < (n - i + 1) ; j ++) cout << -1 << " " ; 
    
    cout << endl ; 
}
signed main()
{
    ios::sync_with_stdio(0) ; 
    cin.tie(0) , cout.tie(0) ; 
    int t; cin >> t ; 
    while(t -- ) {
        solve();    
    }
    
    return 0 ; 
}

0 条评论

目前还没有评论...