试题编号: | 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;
}