题意:
A:CodeForces - 1234C:一共六种类型的水管头,可以旋转, 问给定的水管能否从1, 1连通到2, n, 输出yes,no。
B:初始一个序列n个数,从1到n,序列pi指在初始序列基础上将第i个元素移动至首位。pos(pi,val) 。代表序列pi值为val的数的位置。给出m个数,对于每个pi,求出∣pos(pi,x1)−pos(pi,x2)∣+…+∣pos(pi,xm−1)−pos(pi,xm)∣。
C&F:CodeForces - 1234B1:一共有n条信息,屏幕上只能显示k个好友的信息,如果该好友的信息已经在屏幕上则不发生任何变化,否则将最早的一条好友信息顶掉,新的好友信息进入屏幕。
D:CodeForces - 1234A:一家商店有n个物品,价格分别为a[i] ,店员为了省事,所以打算把所有商品价格调成相同的,但不能亏损,也不能谋暴利,求最小的可行答案。
E:CodeForces - 1234D:给一个字符串,然后进行m次操作,分别有两种操作。1.将x位置的字符变成c。2.输出 L 到 R之间字符不相同的个数。
补题
A:思路:模拟。水管分两类,1和2为a,2345为b。流不通的情况:1:a到a:关注最后一列,如果流到最后一列还在第一行,则流不通。2 :b到a:不能流通。对于1在结尾判断下是不是第一行。对于2在每次换行的时候判断下是不是a类型。
代码:
#include<bits/stdc++.h>
using namespace std;
int t,r,ans;
string s[3];
int main ( ) {
cin >> t;
while(t--){
int n;
cin >> n;
cin >> s[0] >> s[1];
ans=1;
r = 0;
for ( int i = 0; i < n; ++i ) {
if ( s[r][i] == '1' || s[r][i] == '2' )
continue;
else {
r = 1 - r;
if ( s[r][i] == '1' || s[r][i] == '2' ) {
ans = 0;
break;
}
}
}
if(ans&&r)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
C:思路:设置两个数组分别存放屏幕上的朋友的ID,和朋友来信的ID的顺序。用两个循环嵌套,暴力扫存放屏幕上朋友ID的数组 ,如果有 就不执行操作,如果没有 就每个向后移动,然后放在最前面。
代码:
#include <bits/stdc++.h>
using namespace std;
int n,k,x,c,id[210],l[210]= {0},j;
int main()
{
cin>>n>>k;
for(int i=0; i<n; i++)
cin>>id[i];
x=0;
c=0;
for(int i=0; i<n; i++)
{
for (j=0; j<k;)
if (l[j]!=id[i])
{
j++;
x++;
}
else
j++;
j=0;
if(x==k)
{
for(j=k-1; j>0; j--)
l[j]=l[j-1];
l[0]=id[i];
}
x=0;
}
for (j=0; j<k; j++)
if(l[j]>0)
c++;
cout<<c<<endl;
for (j=0; j<k; j++)
if(l[j]>0)
cout<<l[j]<<' ';
}
E:思路:常规暴力解超时,看到大佬用set来储存(Lower_bounder进行查询),过了。
代码:
#include <bits/stdc++.h>
using namespace std;
set<int> se[30];
set<int>::iterator it;
string s;
int main(){
cin >> s;
int n = s.size();
for(int i = 0; i < n; i++){
se[s[i]-'a'].insert(i+1);
}
int m;
cin >> m;
for(int i = 1; i <= m; i++){
int k;
cin >> k;
if(k == 1){
int pos;
char c;
scanf("%d %c", &pos, &c);
se[s[pos-1] -'a'].erase(pos);
s[pos-1] = c;
se[c-'a'].insert(pos);
}
else{
int l, r, ans = 0;
cin >> l >> r;
for(int j = 0; j < 26; j++){
it = se[j].lower_bound(l);
if(it == se[j].end()){
continue;
}
if((*it) <= r){
ans++;
}
}
printf("%d\n", ans);
}
}
}