A: 题意:
找到每一天最多的 i , 使得至少有 i 篇论文引用了 i 个论文
题解: 通过树状数组找到是否存在比前一个答案大一的结果,大样例也过了
#include<iostream>
#include<cstring>
using namespace std;
#define N 100001
#define nn 100000
int num[N];
int ans[N];
int c[N];
int n;
int lowbit(int x){
return x&(-x);
}
int sum(int x){
int a=0;
for(int i=x;i>0;i-=lowbit(i)) a+=c[i];
return a;
}
void update(int x,int v){
for(int i=x;i<=nn;i+=lowbit(i)) c[i]+=v;
}
int main()
{
// ios::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);
int t;
cin>>t;
int cas=0;
while(t--){
cin>>n;
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++) {
cin>>num[i];
update(num[i],1);
int ps = sum(100000)-sum(ans[i-1]);
// cout<<sum(100000)<<" "<<sum(ans[i-1])<<endl;
if(ps>ans[i-1]){
ans[i]=ps;
}else{
ans[i]=ans[i-1];
}
}
cas++;
cout<<"Case #"<<cas<<":";
for(int i=1;i<=n;i++)
cout<<" "<<ans[i];
cout<<"\n";
}
return 0;
}
/*
3
11 1 2
8
2 3
11 11 11
1 2 3 4 5 6 7 8 9 10 11
1 2 3 4 5 6 7 8 9 10 11
1000 6 1
4 8 15 16 23 42
1
*/
B:
题意: n*n 的黑白矩阵,只能翻转对角线上的格子,黑白翻转,输出全部变黑的最小翻转次数
题解:我使用直接dfs 小样例过了,大样例没过。官方题解: 把每一条对角线看成一个点,就有 4*n-2 个点,对于每个格子,都有2个对角线对它有影响,这样就可以对这两个对角线对应的点连边,如果格子是黑色,连边两点同色,否则异色。然后dfs 对图染色,使所有点为黑色。 改变一个点,它对应的点也要翻转。待补
C:
题意:给出 1-9 每位数字的个数,问是否能组成被11整除的数
题解: 暴力过了小样例,官方题解:数学规律,待补