CCF-CSP 202303

试题编号:

202303-2
试题名称:垦田计划
时间限制:1.0s
内存限制:512.0MB

计算机软件能力认证考试系统

方法一 用数组记录所需时间相同的资源和

#include <bits/stdc++.h>
const int M=1e5+10;
using namespace std;
int n, k;
long long int m;
int t[M], c[M], flag[M];
int main(){
    int maxi=0;
    cin>>n>>m>>k;
    for(int i=0;i<n;i++){
        cin>>t[i]>>c[i];
        if(maxi<t[i]) maxi=t[i];
        flag[t[i]]+=c[i];
    }
    for(int i = maxi; i > 0; i--){
        if(maxi == k)break;
        if(m>flag[i]){
            m=m-flag[i];
            flag[i-1]+=flag[i];
            maxi--;
        }else break;
    }
    cout<<maxi;
    return 0;
}

方法二 二分法

#include <bits/stdc++.h>
using namespace std;
const int M=1e5+10;
int n, k ,maxi=0;
long long int m;
struct node{
    int t,c;
}d[M];
int check(int mid){
    long long int sum=0;
    for(int i=0;i<n;i++){
        if(d[i].t>mid){
            sum+=(d[i].t-mid)*d[i].c;
            if(sum>m) return 0;
        }
    }
    return 1;//取值边界
}//l   r
int main(){
    //int maxi=0;
    cin>>n>>m>>k;
    for(int i=0;i<n;i++){
        cin>>d[i].t>>d[i].c;
        maxi=max(d[i].t,maxi);
    }
    int l=k,r=maxi,mid;
    while(l<r){
        mid=l+r>>1;
        if(check(mid)) r=mid;
        else l=mid+1;//sum>m
    }
    cout<<l;//sum=m
    return 0;
}

试题编号:202303-3
试题名称:LDAP
时间限制:12.0s
内存限制:1.0GB

参考大佬的博客:CCF-CSP认证 202303 500分题解_ccfcsp题解_Code92007的博客-CSDN博客

计算机软件能力认证考试系统

#include<bits/stdc++.h>
using namespace std;
const int N=2502;
int len,k,c,d,x,y,num[N],dn[N],re[N];
typedef pair<int,int> P;
map<P,vector<int>>p;
map<int,vector<int>>id;
char s[N],op[N];
bitset<N>stk[N*2],res;

bitset<N>cal(int l,char x,int r){
	bitset<N>ans;
	for(auto &v:p[P(l,r)]) ans.set(v);
	if(x=='~'){
		for(auto &v:id[l]) ans.flip(v);
	}
	return ans;
}
int main(){
    int n,m;
	cin>>n;
	for(int i=1;i<=n;++i){
        cin>>dn[i]>>k;
		for(int j=1;j<=k;++j){
			cin>>x>>y;
			id[x].push_back(i);//记录有id属性的用户
			p[P(x,y)].push_back(i);//记录用户
		}
	}
	scanf("%d",&m);
	for(int i=1;i<=m;++i){
		scanf("%s",s);
		len=strlen(s);
		c=d=0;
		for(int j=0;j<len;){
			if(s[j]=='&' || s[j]=='|')  op[++c]=s[j++];//符号入栈
			else if(s[j]=='(')          j++;
			else if(s[j]==')'){
				num[c]++;
				if(num[c]==2){
					d--;
					if(op[c]=='&') stk[d]=stk[d]&stk[d+1];//操作数栈
					else stk[d]=stk[d]|stk[d+1];
					num[c--]=0;}//每两个括号运算一次,符号出栈
				j++;
			}
			else{
				int l=0,r=0;
				while(j<len && (s[j]!=':' && s[j]!='~')){
					l=l*10+(s[j]-'0');
					j++;
				}//取属性
				char x=s[j++];//去符号
				while(j<len && s[j]!=')'){
					r=r*10+(s[j]-'0');
					j++;
				}//取值
				stk[++d]=cal(l,x,r);//计算对应位的值
			}
		}
		int e=0;
		for(int j=1;j<=n;++j){
			if(stk[d].test(j)) re[++e]=dn[j];
		}
		sort(re+1,re+e+1);
		if(e){
            for(int j=1;j<e;j++) cout<<re[j]<<" ";
            cout<<re[e]<<endl;}
		else cout<<endl;
	}
	return 0;
}

试题编号:202303-5
试题名称:施肥
时间限制:2.0s
内存限制:1.0GB

未通过测试用例,没找到问题,有时间再改

#include <bits/stdc++.h>
using namespace std;
const long long Max=2e5+2;
struct node{
    int l;
    int r;
}a[Max];
int cmp(node b,node c){
    return b.l<c.l;
}
int flag[3000][3000]={0};
int main(){
    int n,m,l,r;
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>a[i].l>>a[i].r;
    }
    sort(a,a+m+1,cmp);
    int sum=0;
    for(int i=1;i<=m;i++){
        if(!flag[a[i].l][a[i].r]){sum++;}

        for(int j=i+1;j<=m;j++){
            l=min(a[i].l,a[j].l);
            r=max(a[i].r,a[j].r);
            if(((a[i].l>a[j].l&&a[i].l<=a[j].r)||(a[i].r=a[j].l&&a[i].r<a[j].r))&&!flag[l][r]){
                sum++;
                flag[l][r]=1;
            }

        }
    }
    cout<<sum;
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值