A-Grass Field
简单思维题!!!
答案为0的情况:四个数全为0
答案为1的情况:存在1的同时存在0
答案为2的情况:四个数全为1
#include <bits/stdc++.h>
using namespace std;
#define sc(x) scanf("%d",&x)
#define sl(x) scanf("%lld",&x)
#define ll long long
#define pb push_back
typedef pair<int,int>PII;
const int Max=1e6+5;
const ll INF=1e15+5;
const int mod=998244353;
int a[10][10];
int main(){
int t;sc(t);
while(t--){
bool flag=false,word=false;
for(int i=1;i<=2;i++){
for(int j=1;j<=2;j++){
sc(a[i][j]);
if(a[i][j]==1) flag=true;
else word=true;
}
}
if(!flag) printf("0\n");
else if(flag&&!word) printf("2\n");
else printf("1\n");
}
}
B-Permutation
简单思维,倍数为2一直往右填即可
#include <bits/stdc++.h>
using namespace std;
#define sc(x) scanf("%d",&x)
#define sl(x) scanf("%lld",&x)
#define ll long long
#define pb push_back
typedef pair<int,int>PII;
const int Max=1e6+5;
const ll INF=1e15+5;
const int mod=998244353;
bool vis[Max];
int main(){
int t;sc(t);
while(t--){
int n;sc(n);
for(int i=1;i<=n;i++) vis[i]=false;
printf("2\n");
for(int i=1;i<=n;i++){
if(vis[i]) continue;
// vis[i]=true;
int num=i;
while(num<=n&&!vis[num]){
vis[num]=true;
printf("%d ",num);
num*=2;
}
}
printf("\n");
}
}
C-Schedule Management
二分,先预处理每个工人能一个小时完成的任务数,然后二分答案,check O(n)判断即可!!!
切记,check不要爆int,开ll
#include <bits/stdc++.h>
using namespace std;
#define sc(x) scanf("%d",&x)
#define sl(x) scanf("%lld",&x)
#define ll long long
#define pb push_back
typedef pair<int,int>PII;
const int Max=1e6+5;
const ll INF=1e15+5;
const int mod=998244353;
int a[Max];
int h[Max];
int sum[Max];
int n;
bool check(int x){
ll ans=0;
for(int i=1;i<=n;i++){
if(h[i]>=x) ans+=(h[i]-x);
}
for(int i=1;i<=n;i++){
if(h[i]<=x){
ans-=(x-h[i])/2;
}
}
if(ans<=0) return true;
return false;
}
int main(){
int t;sc(t);
while(t--){
sc(n);
for(int i=1;i<=n;i++) h[i]=0;
int m;sc(m);
for(int i=1;i<=m;i++){
sc(a[i]);h[a[i]]++;
}
sort(h+1,h+1+n);
// for(int i=1;i<=n;i++) sum[h[i]]++;
int l=h[1],r=h[n];
while(l<=r){
int mid=(l+r)/2;
if(check(mid)) r=mid-1;
else l=mid+1;
}
printf("%d\n",l);
}
}
D-Permutation Restoration
贪心!!!
先计算出每个位置可填数字的范围,然后肯定是选取最左边的区间,然后在可达右区间最小的位置先进行放置,这样子才可以让后面的位置有尽可能多的位置1选择,可以用优先队列存下每个区间,然后用一个集合来维护当前合法的位置即可。
#include <bits/stdc++.h>
using namespace std;
#define sc(x) scanf("%d",&x)
#define sl(x) scanf("%lld",&x)
#define ll long long
#define pb push_back
typedef pair<int,int>PII;
const int Max=1e6+5;
const ll INF=1e15+5;
const int mod=1e9+7;
struct node{
int r;
int value;
friend bool operator<(node a,node b){
return a.r>b.r;
}
};
priority_queue<node>mp[Max];
bool vis[Max];
int a[Max];
int main(){
int t;sc(t);
while(t--){
int n;sc(n);
for(int i=1;i<=n;i++) vis[i]=false;
for(int i=1;i<=n;i++){
int k;sc(k);
int L,R;
if(k==0) L=i+1,R=n;
else{
R=i/k;
L=i/(k+1)+1;
}
mp[L].push({R,i});
}
priority_queue<node>s;
for(int i=1;i<=n;i++){
while(!mp[i].empty()){
s.push(mp[i].top());
mp[i].pop();
}
node temp=s.top();
a[temp.value]=i;
s.pop();
}
for(int i=1;i<=n;i++) printf("%d ",a[i]);
printf("\n");
}
}
本次比赛,打崩了,C没有立马想到二分,在写的过程中也没有发现自己爆了int,以后这样成为一个思维习惯,开int的同时想会不会爆int,避免不必要的罚时!!!D题还需要练,思维太慢,有时甚至想不出来!!!菜死了T-T