189612f7dd192b6dffc61ef9a0071bc

解题代码:

f590df989aad237270309faf3b791cc

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

int main()
{
int n, Q, tc;
ios::sync_with_stdio(false);
cin >> n >> Q >> tc;
vector<ll> t(n + 1);
for(int i = 1; i <= n; i ++)
cin >> t[i];
sort(t.begin(), t.end());
for(int i = 1; i <= n; i ++)
t[i] += t[i - 1];
while(Q --)
{
ll M;
cin >> M;
//(n - pos)* tc <= M
ll c = min((ll)n, M / tc);//防止越界
ll ans = t[n - c] + tc;
cout << ans << '\n';
}
return 0;
}

7dc8cbaeba3e586f19c859a43de8129

解题思路:

  • 对于每一场情况都有3种情况出现,比如下面这种就是2场比赛就有9种情况出现。我们所要做的是,遍历这9种情况。事实上,可以先定义一个pw3[]数组,记录当打了m场时一共有多少种情况,然后依次遍历即可。在每次遍历的时候,设置一个maxn变量记录id最小的情况,最终遍历完后所得到的即为第一只鸡的最小的id情况。

主客场解题思路

相应的代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N = 15;
int pw3[N];
int a[N],u[N],v[N];

void solve(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>u[i]>>v[i];
int maxn = n; // 用来记录id最小的时候的取值
for(int i=0;i<pw3[m];i++){

}
}

void init(){
pw3[0] = 1;
for(int i=1;i<=N) pw3[i] = 3*pw3[i-1];
}

int main()
{
int t;
cin>>t;
init();
while(t--){
solve();
}
return 0
}

难哭了QAQ~~

df6a41f70bd24e2bf25f7c8274ce0ba

思路:

疯狂遍历所有的情况,然后把它存到set里面(这里就要考虑到如何将每一种情况i都遍历一遍了,好巧妙QAQ),然后对于每次询问,只要看它是否在set里面即可。遍历的方法:

  • 减1的情况:每遍历一个数组元素a[i],就整个数组元素都减去它,相当于每个数组元素都执行了a[i]次减减,然后在这基础上再继续减减,直到超出了所指定的范围-1e9,这是就把减减的所有情况都搞出来了,并存入到了set里面
  • 加1的情况:每遍历一个数组元素a[i],就整个数组元素都加上它,相当于每个数组元素都执行了a[i]次加加,然后在这基础上再继续加加,直到超出了所指定的范围1e9,这是就把加加的所有情况都搞出来了,并存入到了set里面
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
constexpr int Inf = 1e9,N = 2e5 +10;

ll a[N]; // 数据范围
int n; // 实际用的数据空间
set<int>s;

bool check(ll x){
ll res = 1;
for(int i=1;i<=n;i++){
res *= a[i]+x;
if(llabs(res)>Inf) return false;
}
s.emplace(res); // 如果不会超出范围的话,就把它存入set中,其实这里不用set数据结构也是可以的,只不过是效率问题,用vector的find也可以
return true;
}

int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int q,M;
cin>>n>>q;
ll l,r;
for(int i=1;i<=n;i++) cin>>a[i];
s.emplace(0);
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
if(a[i] == a[i-1]) continue; // 就是因为当它相等的时候,先前的一个结果就已经搞定了,再来一个同样的数据的话其实是等效的
for(l = -a[i]-1;check(l);l--);
for(r = -a[i]+1;check(r);r++);
}
while(q--){
cin>>M;
cout<<(s.count(M)?"Yes\n":"No\n"); // 结果M是否存在set中,这个set就是把所有的结果都存了起来
}

return 0;
}

好家伙,玩起了概率题?

4c8cc38782648bcd4534e4d0b6c8471

3826e1916d71c498cd67eb1adaf4ae0

  • 代码如下
#include "bits/stdc++.h"

using namespace std;
using i64 = long long;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);

int n;
cin >> n;

int ans = 0;
for (int i = 0; i < n; i++) {
int x, y, r;
cin >> x >> y >> r;
if (x <= 9 && x >= -9 && y <= 9 && y >= -9) {
ans++;
}
}

if (ans <= n / 90) {
cout << "bit-noob\n";
} else {
cout << "buaa-noob\n";
}

return 0;
}