A
题意:水题
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t,c;
scanf("%d", &t);
while (t--)
{
int n, sum = 0, a;
scanf("%d", &n);
for (int i = 1;i <= n;i++)
scanf("%d", &a), sum += a;
printf("%d\n", (sum+n-1)/n);
}
return 0;
}
B
题意:就是说你一共要收到n条消息,一共有k个栏位,如果新来的消息是在栏位上的一个人发来的就会挡掉她之前的消息,如果栏位满了,并且新来消息,就会挤掉栏位最下面的消息,然后给你n条消息来的顺序,问你最后的消息栏将会是什么情况。
思路:用队列处理,每次进队列先检查有没有她发的消息,没有就添加进队列,满了就把第一个元素移出队列。
#include <iostream>
#include <vector>
#include <cstring>
#include <string>
#include <deque>
#include <unordered_set>
#include <stack>
using namespace std;
typedef long long LL;
class SocialNetWork {
public:
deque<LL> Q;
void func(vector<LL>& message, LL limit) {
for (auto mem:message) {
if (S.count(mem))
continue;
else {
if (Q.size() < limit) {
S.insert(mem);
Q.push_back(mem);
}else {
S.erase(Q.front());
Q.pop_front();
S.insert(mem);
Q.push_back(mem);
}
}
}
}
private:
unordered_set<LL> S;
};
int main()
{
LL n,k,c;
cin >>n>>k;
vector<LL> V(n,0);
for (LL i = 0; i < n; i++) {
cin >> V[i];
}
SocialNetWork api;
api.func(V,k);
cout << api.Q.size() << endl;
while (!api.Q.empty()) {
cout << api.Q.back()<<" ";
api.Q.pop_back();
}
return 0;
}
C
题意:给两行元素,每个元素内包含一个管子,有直的有直角的,问你能不能从第一行第一个元素走到第二行最后一个元素
思路:个人觉得比B题简单,思维题,看每一竖行的两个元素,如果两个元素都是直角管,那么,在这行就必须是要改行的,从一行到二行或二行到一行,而且入口随意,但一定改行,用一个元素f表示行数,判断最后能不能到a[n][1]
#include<iostream>
#include<cstring>
using namespace std;
char a[200005][2];
int vis[200005];
int main(){
int t,n,i,j;
cin>>t;
while(t--)
{
cin>>n;
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++) cin>>a[i][0];
for(i=1;i<=n;i++) cin>>a[i][1];
for(i=1;i<=n;i++)
if((a[i][0]-'0'>=3)&&(a[i][1]-'0'>=3))
vis[i]=1;
int f=0;
for(i=1;i<=n;i++)
{
if(vis[i]==1) f++;
else
{
if((a[i][f%2]-'0')>=3)
{
cout<<"NO"<<endl;
break;
}
}
}
if(i==n+1&&f%2==1) cout<<"YES"<<endl;
else if(i==n+1) cout<<"NO"<<endl;
}
}