第十一届“图灵杯“NEUQ-ACM程序设计竞赛

题目链接

古堡中的勇者

这里是引用

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

//#defien int long long
#define x first 
#define y second
#define endl '\n'
#define rep(i,a,b) for(int i=(a);i<=b;i++)
#define lep(i,a,b) for(int i=(a);i>=b;i--)
#define mem(a,x) memset(a,x,sizeof a)
#define mep(a,x) memcpy(a,x,sizeof x)

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<int,ll> pil;
typedef pair<ll,int> pli;
const int N=1e6+10;


signed main(){
	int a,b,c,n,ans=0;
	cin>>a>>b>>c>>n;
	for(int i=0;i<n;i++){
		int x;cin>>x;
		if(x>b&&x<c) ans++;
	}
	cout<<ans<<endl;
	return 0;
}

三星五费

这里是引用

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

//#defien int long long
#define x first 
#define y second
#define endl '\n'
#define rep(i,a,b) for(int i=(a);i<=b;i++)
#define lep(i,a,b) for(int i=(a);i>=b;i--)
#define mem(a,x) memset(a,x,sizeof a)
#define mep(a,x) memcpy(a,x,sizeof x)

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<int,ll> pil;
typedef pair<ll,int> pli;
const int N=1e6+10;


signed main(){
	int n;cin>>n;
	int t=(n-5)/2;
	double ans=1;
	if(n<7){
		ans=0;
	}else{
		rep(i,1,t) ans*=0.97;
		ans=1-ans;
	}
	printf("%.3lf\n",ans);
	return 0;
}

我就要不协调

这里是引用

#include<bits/stdc++.h>
using namespace std;
const int N=510;

int main(){
    int t,n,x;
    cin>>t;
    while(t--){
        cin>>n;
        int mx=0,flag=0,des=1e9;
        for(int i=0;i<n;i++){
            cin>>x;
            if(x<mx){
                flag=1;
            }
            else{
                if(i!=0) des=min(des,(x-mx));
                mx=max(mx,x);
            }
        }
        if(flag){
            cout<<"0"<<endl;
            continue;
        }
        int ans=des/2+1;
        cout<<ans<<endl;
    }
    return 0;
}

字母匹配

这里是引用

#include<bits/stdc++.h>
using namespace std;
//#defien int long long
#define x first 
#define y second
#define endl '\n'
#define rep(i,a,b) for(int i=(a);i<=b;i++)
#define lep(i,a,b) for(int i=(a);i>=b;i--)
#define mem(a,x) memset(a,x,sizeof a)
#define mep(a,x) memcpy(a,x,sizeof x)
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<int,ll> pil;
typedef pair<ll,int> pli;
const int N=2e5+10,P=131;
int n,m,q,k,ans=0;
map<int,int> mp;

signed main(){
	cin>>n>>k;
	string s;
	cin>>s;
	for(int i=0;i<n;i++){
		mp[s[i]]++;
	}
	for(int i=0;i<26;i++){
		int cnt1=mp['a'+i],cnt2=mp['A'+i];
		if(cnt1>cnt2) swap(cnt1,cnt2);
		ans+=cnt1;
		if(k){
			int add=min(k,(cnt2-cnt1)/2);
			ans+=add;
			k-=add;
		}
	}
	cout<<ans<<endl;
	return 0;
}

数学家的四不要

这里是引用

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e8+10;

int prime[N],cnt,sj[N],C[N],c[N];
bool isou(int n){
    if(n&1)
        return false;
    else 
        return true;
}
bool iszhi(int n){
    if(n<2) return false;
    for(int i=2;i<=n/i;i++){
        if(n%i==0)
            return false;
    }
    return true;
}
void get_san(int n){
    ll t=0;
    for(int i=1;i<=1200;i++){
        t+=i;
        sj[t]=1;
    }
}

void kate(int n){
    c[0]=c[1]=1;
    C[1]=1;
    for(int i=2;i<=17;i++){
        ll ans=1;
        for(int j=1,k=2*i;j<=i;j++,k--){
            ans*=k;
            ans/=j;
        }
        ans/=(i+1);
        C[ans]=1;
    }
}
int main(){
    int n;
    cin>>n;
    kate(n);
    get_san(n);
    int ans=0;
    for(int i=1;i<=n;i++){
        if(!isou(i)&&!iszhi(i)&&!sj[i]&&!C[i]){
            ans++;
        }
    }
    cout<<ans<<endl;
    return 0;
}

旗鼓相当的对手

这里是引用

#include<bits/stdc++.h>
using namespace std;
//#defien int long long
#define x first 
#define y second
#define endl '\n'
#define rep(i,a,b) for(int i=(a);i<=b;i++)
#define lep(i,a,b) for(int i=(a);i>=b;i--)
#define mem(a,x) memset(a,x,sizeof a)
#define mep(a,x) memcpy(a,x,sizeof x)
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<int,ll> pil;
typedef pair<ll,int> pli;
const int N=2e5+10,P=131;
int n,m,q,k,ans=1e5+10;
int v[N],f[N];

signed main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int n;cin>>n;
	f[0]=1;
	rep(i,1,n) cin>>v[i],m+=v[i];
	rep(i,1,n) for(int j=m;j>=v[i];j--){
		f[j]|=f[j-v[i]];
	} 

	for(int i=0;i<m;i++){
		if(f[i]) ans=min(ans,abs(m-2*i));
	}
	cout<<ans<<endl;
	return 0;
}

卷王

这里是引用

#include<bits/stdc++.h>
using namespace std;
//#defien int long long
#define x first 
#define y second
#define endl '\n'
#define rep(i,a,b) for(int i=(a);i<=b;i++)
#define lep(i,a,b) for(int i=(a);i>=b;i--)
#define mem(a,x) memset(a,x,sizeof a)
#define mep(a,x) memcpy(a,x,sizeof x)
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<int,ll> pil;
typedef pair<ll,int> pli;
const int N=2e5+10,P=131;
int n,m,q,k,ans=1;
int a[N],b[N];

signed main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int n,d;cin>>n>>d;
	rep(i,1,n) cin>>a[i];
	rep(i,1,n) cin>>b[i];
	int s=a[d]+b[1];
	for(int i=1,j=n;i<d;i++){
		if(a[i]+b[j]>s) ans++;
		else j--;
	}
	cout<<ans<<endl;
	return 0;
}

字符比较

这里是引用

#include<bits/stdc++.h>
using namespace std;
//#defien int long long
#define x first 
#define y second
#define endl '\n'
#define rep(i,a,b) for(int i=(a);i<=b;i++)
#define lep(i,a,b) for(int i=(a);i>=b;i--)
#define mem(a,x) memset(a,x,sizeof a)
#define mep(a,x) memcpy(a,x,sizeof x)
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<int,ll> pil;
typedef pair<ll,int> pli;
const int N=2e5+10,P=131;
char s1[N],s2[N];
int h1[N],h2[N],p[N];
int n,m,q;

int get(int h[N],int l,int r){
	return h[r]-h[l-1]*p[r-l+1];
}

signed main(){
	cin>>n>>m>>q>>s1+1>>s2+1;
	p[0]=1;
	for(int i=1;i<=max(n,m);i++) p[i]=p[i-1]*P;
	for(int i=1;i<=n;i++){
		h1[i]=h1[i-1]*P+s1[i]-'a';
	}
	for(int i=1;i<=m;i++){
		h2[i]=h2[i-1]*P+s2[i]-'a';
	}
	
	while(q--){
		int l1,r1,l2,r2;
		cin>>l1>>r1>>l2>>r2;
		int l=-1,r=r1-l1+2;
		while(l+1<r){
			int mid=l+r>>1;
			if(get(h1,l1,l1+mid-1)==get(h2,l2,l2+mid-1))
				l=mid;
			else
				r=mid;
		}
		if(l==-1){
			if(s1[0]<s2[0]) cout<<"<"<<endl;
			else cout<<">"<<endl;
		}
		else if(l==r1-l1+1) cout<<"="<<endl;
		else{
			if(s1[l1+l]<s2[l2+l]) cout<<"<"<<endl;
			else cout<<">"<<endl;
		}
	}
	return 0;
}

小C的学习计划

这里是引用

#include<bits/stdc++.h>
using namespace std;
typedef long double ld;
typedef long long ll;
const int N=20;
ld f[1<<20];
int a[N];

int main(){
	int n,m;
	cin>>n>>m;
	for(int i=0;i<n;i++) cin>>a[i];
	for(int i=(1<<n)-1;~i;i--){
		ld s=1;
		ll sum=0,cnt=0;
		for(int j=0;j<n;j++){
			if((i>>j)&1) sum+=a[j],cnt++;
			else s+=1.0/n*f[i|1<<j];
		}
		if(sum>=m) f[i]=0;
		else{
			f[i]=s/(1-(ld)cnt/n);
		}
	}
	printf("%.6Lf",f[0]);
}

网格谜题

这里是引用

#include<bits/stdc++.h>

using namespace std;

#define itn int
typedef long long ll;
typedef pair<ll, ll> PLL;
#define rep(i,a,b) for(int i=(a);i<=(b);i++)

const int N = 4e6 + 10;
ll n, m, k;

int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};

//建图 
vector<PLL> e[N];
array<int, 4> bri[N];
ll w[N], st[N], p[N];

//冰茶机
int find(int x)
{
    return x == p[x] ? x : p[x] = find(p[x]);
}

void solve()
{
    cin >> n >> m >> k;
    priority_queue<PLL> q;
    
    //二维做成一维
    auto id = [&](ll x, ll y)
    {
        return m * (x - 1) + y;
    };
    
    ll res = 0;
    rep(i, 1, n) rep(j, 1, m) 
    {
        cin >> w[id(i, j)]; q.push({w[id(i, j)], id(i, j)});
        res += w[id(i, j)]; 
        p[id(i, j)] = id(i, j);
    }
    
    if(res < k * (n * m - 1))
    {
        cout << "NO" << '\n';
        return;
    }
    
    int cnt = 0; //标记边
    cout << "YES" << '\n';
    rep(x, 1, n) rep(y, 1, m) rep(k, 0, 3)
    {
        int xx = x + dx[k], yy = y + dy[k];
        if(xx < 1 || yy < 1 || xx > n || yy > m) continue;
        ++cnt;
        bri[cnt] = {x, y, xx, yy};
        e[id(x, y)].push_back({id(xx, yy), cnt});
    }
    
    cout << n * m - 1 << '\n';
    while(q.size())
    {
        //最大块的权重, 最大块的编号
        auto [wi, pi] = q.top(); q.pop();
        pi=find(pi);
        //如果已经做过这个块, 返回
        if(st[pi]) continue;
        
        //合并它和它周边的块, 注意做一次就退出, 因为做一次之后他就不一定是最大的块
        //再硬合并可能会导致负数出现
        while(e[pi].size())
        {
            auto [to, lt] = e[pi].back();
            to = find(to);
            
            //如果已经是一个块, 不用再合并
            if(to == pi) 
            {
                e[pi].pop_back();
                continue;
            }
            
            //合并, 把另一个块的边接进来
            //每次把小的接到大的块上, 所以注意可能的swap
            p[to] = p[pi];
//             p[pi]=p[to];
            if(e[to].size() > e[pi].size()) swap(e[to], e[pi]);
            for(auto [t1, t2] : e[to])
            {
                if(find(t1) == pi) continue;
                e[pi].push_back({t1, t2});
            }
            
            for(auto x : bri[lt]) cout << x << ' '; cout << '\n';
            st[to] = 1; //这个块被合并了, 接下来不用理他了
            w[pi] = wi + w[to] - k;
            q.push({w[pi], pi});
            break;
        }
    }
}

signed main() {
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int T; T = 1;
    //cin >> T;
    while (T--)
    {
        solve();
    }

    return 0;
}
  • 44
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值