关于取模:
总结:4.15比赛,100分钟A了A、B两题,C题一直超时,对数据结构运用不灵活,学习auto!
A - Job Interview
思路:遍历输入的字符串,若发现o和x则进行标记,最后根据标记进行输出
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
string s;
cin>>s;
bool f1=0,f2=0;
for(int i=0;i<n;i++){
if(s[i]=='o'){
f1=1;
}else if(s[i]=='x'){
f2=1;
break;
}
}
if(f2||!f1){
cout<<"No";
}else{
cout<<"Yes";
}
return 0;
}
B - Coloring Matrix
思路:题目中的这句话很重要:for every pair of integers (i,j) such that 1≤i,j≤N simultaneously replace Ai,j with AN+1−j,i.由此便可得出公式,每个数经过变换可能有四个出现的位置,计算A图中四个可能位置数的总和和B图中四个可能位置的和作比较
#include<iostream>
using namespace std;
const int N=105;
int a[N][N],b[N][N];
int main(){
bool f=0;
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>b[i][j];
}
}
for(int i=1;i<=n;i++){
if(f){
break;
}
for(int j=1;j<=n;j++){
if(a[i][j]+a[n+1-j][i]+a[n+1-i][n+1-j]+a[j][n+1-i]>b[i][j]+b[n+1-j][i]+b[n+1-i][n+1-j]+b[j][n+1-i]){
f=1;
break;
}
}
}
if(f){
cout<<"No";
}else{
cout<<"Yes";
}
return 0;
}
C - Cards Query Problem
学习auto,可以简化!!!
思路:定义一个vector n[i]来表示桶中的元素,定义一个set s[i]来表示元素被放入哪个桶中,注意对二维容器的排序和set的输出
#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
const int N=200005;
vector<int>n[N];
set<int>s[N];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int nn,q,op,a,b;
cin>>nn;
cin>>q;
while(q--){
cin>>op;
if(op==1){
cin>>a>>b;
n[b].push_back(a);
s[a].insert(b);
}else if(op==2){
cin>>a;
sort(n[a].begin(),n[a].end());
for(int i=0;i<n[a].size();i++){
cout<<n[a][i]<<' ';
}
cout<<'\n';
}else if(op==3){
cin>>a;
for(auto v=s[a].begin();v!=s[a].end();v++){
cout<<*v<<' ';
}
cout<<'\n';
}
}
return 0;
}
D - Writing a Numeral
思路:看到先进先出这一关键信息首先想到的便是queue队列,于是TLE...不能最后统一处理结果ans,容易超时,要边进行边处理
TLE代码:
#include<iostream>
#include<queue>
#define int long long
using namespace std;
const int mod=998244353;
signed main(){
queue<int>q;
q.push(1);
int Q,op,x;
cin>>Q;
while(Q--){
cin>>op;
if(op==1){
cin>>x;
q.push(x);
}else if(op==2){
q.pop();
}else if(op==3){
int ans=0,n;
for(int i=1;i<=q.size();i++){
n=q.front();
ans=(ans*10%mod+n%mod)%mod;
q.push(n);
q.pop();
}
cout<<ans<<'\n';
}
}
return 0;
}
取模很重要!!!很重要!!!!处处都有取模!!!!!
正确思路:用a[i]数组来表示1后面有i个0的数字,操作一即对ans*10再加上加到末尾的数字,操作二即对ans减去删去的第一个数乘数的位数(比如9432-9*1000=432),因此删去第一个数,操作三直接输出即可
#include<iostream>
#include<queue>
#define int long long
using namespace std;
const int mod=998244353;
int a[600005];
signed main(){
queue<int>q;
q.push(1);
int Q,op,x,ans=1;
cin>>Q;
a[0]=1;
for(int i=1;i<=Q;i++){
a[i]=a[i-1]*10%mod;
}
while(Q--){
cin>>op;
if(op==1){
cin>>x;
q.push(x);
ans=(ans*10+x)%mod;
}else if(op==2){
x=q.front();
q.pop();
ans=(ans+mod-x*a[q.size()]%mod)%mod;
}else if(op==3){
cout<<ans<<'\n';
}
}
return 0;
}
E - Unfair Sugoroku
动态规划!!!