本人是蒟蒻,就补了过题数在一千人以上的题,AM简单题不补了。
B 关鸡
原题链接
有两种关住鸡的方式,需要分类讨论
第一种
第二种
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
//typedef long long ll;
const int mod = 1000000007;
const int N = 2e5 + 10;
//int 类型最小-2147483647
int t,n,m,k;
int x,y,a[N],b[N];
map<int,int> m1,m2;
void solve()
{
m1.clear();
m2.clear();
cin>>n;
if(n==0) { // 如果点的数量为0
cout<<3<<endl; // 输出3,第一种方式
}else{
int res1=4,res2=3;
bool ll=0,rr=0;
for(int i=0;i<n;i++)
{
cin>>x>>y;
if(x==1&&y==1||x==1&&y==-1||x==2&&y==0) res2--;
if(y<=0) ll=1;
if(y>=0) rr=1;
if(x==1) m1[y]++;
if(x==2) m2[y]++;
}
if(ll) res1--;
if(rr) res1--;
bool l=0,r=0;
for(auto it:m1) {
int p=it.first;
if(p<0)
if(m2[p-1]||m2[p]||m2[p+1])
l=1;
if(p>0)
if(m2[p-1]||m2[p]||m2[p+1])
r=1;
}
if(l) res1--;
if(r) res1--;
cout<<min(res1,res2)<<endl;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T=1;
cin >> T;
while(T--)
solve();
return 0;
}
C 按闹分配
原题链接
贪心问题,总不满意度增加就是tc*排在鸡后面的人数
Smin=所有人的办事时间+等待时间
要有Smin,必须Ti小的在前面,使用sort排序
给定最大不满意度M,可以求出排在鸡后面的人数最多是M/tc(向下取整)
再看排在鸡前面的人时间加起来是多少,用前缀和
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
//typedef long long ll;
const int mod = 1000000007;
const int N = 1e5 + 10;
//int 类型最小-2147483647
int a[N];
void solve()
{
int n,q,t;
cin >> n >> q >> t ;
for(int i=1;i<=n;i++) cin>>a[i] ;
sort(a+1,a+n+1);
while(q--)
{
int m;
cin>>m;
int res=0;
for(int i=1;i<=n-m/t;i++) res+=a[i];
cout<<res+t<<endl;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T=1;
//cin >> T;
while(T--)
solve();
return 0;
}
E 本题又主要考察了贪心
原题链接
由于T(1≤T≤100),n,m(2≤n≤10,1≤m≤10)的范围比较小,直接dfs枚举,出题人故意诱导小白使用贪心来写
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
//typedef long long ll;
const int mod = 1000000007;
const int N = 15;
//int 类型最小-2147483647
int a[N],b[N],c[N];
int n,m,res;
void dfs(int u)
{
if(u==m )
{
int cnt=1;
for(int i=2;i<=n;i++)
{
if(a[1]<a[i])
cnt++;
}
res=min(cnt,res);
return;
}
a[b[u]]+=3;
dfs(u+1);
a[b[u]]-=3;
a[c[u]]+=3;
dfs(u+1);
a[c[u]]-=3;
a[b[u]]++;
a[c[u]]++;
dfs(u+1);
a[b[u]]--;
a[c[u]]--;
}
void solve()
{
cin >> n >> m;
res=n;
for(int i = 1; i <= n; i++) cin>>a[i];
for(int i = 0; i < m; i++) cin>>b[i]>>c[i];
dfs(0);
cout<<res<<endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T=1;
cin >> T;
while(T--)
solve();
return 0;
}
G why买外卖
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
//typedef long long ll;
const int mod = 1000000007;
const int N = 3e6 + 10;
//int 类型最小-2147483647
pair<int, int>q[N];
void solve()
{
int n,m,res,sum=0;
cin>>n>>m;
res=m;
for(int i=1;i<=n;i++)
{
int u,v;
cin>>u>>v;
q[i]={u,v};
}
sort(q+1,q+n+1);
for(int i=1;i<=n;i++)
{
sum+=q[i].second;
if(q[i].first-sum<=m)
{
res=max (res,m+sum);
}
}
cout<<res<<endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T=1;
cin >> T;
while(T--)
solve();
return 0;
}
L 要有光
原题链接
只要求地上的阴影面积,就是求梯形的面积
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
//typedef long long ll;
const int mod = 1000000007;
const int N = 2e5 + 10;
//int 类型最小-2147483647
void solve()
{
double c,d,h,w;
cin >> c>>d>>h>>w;
cout<<3*c*w<<endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T=1;
cin >> T;
while(T--)
solve();
return 0;
}