A.Casimir's String Solitaire
一个A需要一个B一个C需要一个B,所以只要A和C的个数之和等于B即可
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
void solve()
{
string s;
cin>>s;
int cnt1=0,cnt2=0,cnt3=0;
for(int i=0;i<s.size();i++){
if(s[i]=='A') cnt1++;
else if(s[i]=='B') cnt2++;
else if(s[i]=='C') cnt3++;
}
// cout<<cnt1<<endl;
// cout<<cnt2<<endl;
// cout<<cnt3<<endl;
if(cnt1+cnt3==cnt2) puts("Yes");
else puts("No");
}
signed main()
{
int t;
cin>>t;
while(t--)
solve();
return 0;
}
B.Shifting Sort
只需要n-1次,第一次将最小的移到第一位,第二次将第二小的移到第二位,以此类推,只需n-1次
但是要注意,d的范围是1到r-l,所以如果哪一次位置已经是对的时候,就不能输出答案,所以要记录答案,最后再一起输出
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#define int long long
using namespace std;
const int N=110;
int b[N];
struct node{
int x,y;
int d;
}q[N];
void solve()
{
// cout<<endl;
int n;
cin>>n;
vector<int>a;//不要乱加括号
memset(q,0,sizeof q);
int cnt=0;
for(int i=1;i<=n;i++){
int x;
cin>>x;
a.push_back(x);
b[i]=x;
}
sort(b+1,b+1+n);
int m=n;
for(int i=1;i<n;i++){
for(int j=0;j<m;j++){
if(*a.begin()==b[i]){
if(j) q[++cnt]={i,n,j};
a.erase(a.begin());
m--;
break;
}
else{
a.push_back(*a.begin());
a.erase(a.begin());
}
}
}
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++){
cout<<q[i].x<<" "<<q[i].y<<" "<<q[i].d<<endl;
}
// cout<<endl;
}
signed main()
{
int t;
cin>>t;
while(t--)
solve();
return 0;
}
C.Ticks
对于每一个星号,去拓展V字型,如果拓展出的V字型的大小大于等于题目要求的k,那么该V字型可生成,标记一下,将其记成一个字母比如说w,不管之前该字符是型号还是点号,都被w覆盖了,最终看是否还存在星号,如果不存在星号,说明所需要绘制的图形可以被我们刚才所做的图形所覆盖,也就是说我们可以绘制出目标图形,则输出Yes,如果还存在星号,则说明不能完整绘制出目标图形,则输出No
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int N=50;
string s[N];
void solve()
{
int n,m,k;
cin>>n>>m>>k;
for(int i=0;i<n;i++) cin>>s[i];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(s[i][j]=='.') continue;
int cnt=0;
while(i-cnt>=0&&j-cnt>=0&&j+cnt<m&&s[i-cnt][j-cnt]!='.'&&s[i-cnt][j+cnt]!='.') cnt++;
cnt--;
if(cnt>=k){
for(int k=0;k<=cnt;k++){
s[i-k][j-k]=s[i-k][j+k]='w';
}
}
}
}
bool flag=true;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(s[i][j]=='*'){
flag=false;
break;
}
}
if(!flag) break;
}
if(flag) puts("Yes");
else puts("No");
}
signed main()
{
int t;
cin>>t;
while(t--)
solve();
return 0;
}
D.Productive Meeting
贪心,每次将次数最多的两个进行交谈,直到无法交谈为止,这样做下来,剩下的次数都是尽可能的多,可供交谈的选择也尽可能多
用大根堆
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#define int long long
using namespace std;
typedef pair<int,int>PII;
void solve()
{
cout<<endl;
int n;
cin>>n;
priority_queue<PII>q;
vector<PII>ans;
for(int i=1;i<=n;i++){
int x;
cin>>x;
if(x>0) q.push({x,i});
}
while(q.size()>1){
auto t=q.top();
int x=t.first,i1=t.second;
q.pop();
t=q.top();
int y=t.first,i2=t.second;
q.pop();
x--;
y--;
ans.push_back({i1,i2});
if(x>0) q.push({x,i1});
if(y>0) q.push({y,i2});
}
cout<<ans.size()<<endl;
for(auto v:ans){
cout<<v.first<<" "<<v.second<<endl;
}
cout<<endl;
}
signed main()
{
int t;
cin>>t;
while(t--)
solve();
return 0;
}
E1.Permutation Minimization by Deque
用双端队列模拟即可
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<deque>
#define int long long
using namespace std;
void solve()
{
int n;
cin>>n;
int x;
deque<int>q;
for(int i=0;i<n;i++){
cin>>x;
if(q.empty()) q.push_back(x);
else{
if(x<q.front()) q.push_front(x);
else q.push_back(x);
}
}
// cout<<q.size()<<endl;
while(q.size()){
cout<<q.front()<<" ";
q.pop_front();
}
cout<<endl;
}
signed main()
{
int t;
cin>>t;
while(t--)
solve();
return 0;
}