自从上紫后打的四场四连跪,总共掉了200分,开始怀疑人生。
昨天晚上5点打组队赛,然后10点半打cf,当时就比较困了,但这div2过了2题也太说不过去了,跟上一场犯的错误一模一样,当C做不出来就死磕,应该果断点放弃的,D题明显是个简单题,最后又因为没有时间而敲不完。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=100050;
int a[maxn];
int main()
{
int n,t,m;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
int sum=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
int ans=min(sum,m);
printf("%d\n",ans);
}
return 0;
}
题解:
对与i,最后形成的字符串是(i,末尾)+ A.A为字符串(1,i-1),当字符串长度和i的奇偶性相同时A需要反转。
这样每个i的字符串就得到了,然后n^2的比较大小就行。
比赛的时候写复杂了,字符串应该是可以直接比较的,不需要自己写比较,直接维护字典序最小的字符串即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5050;
char s[maxn];
char a[maxn][maxn];
int vis[maxn];
int main()
{
int n,t,m;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
scanf("%s",s+1);
int flag=0;
for(int i=1;i<=n;i++){
int cnt=0;
for(int j=i;j<=n;j++) a[i][++cnt]=s[j];
int f=(n%2)^(i%2);
//printf("%d!\n",f);
if(f){
for(int j=1;j<i;j++) a[i][++cnt]=s[j];
}
else for(int j=i-1;j>=1;j--) a[i][++cnt]=s[j];
vis[i]=0;
}
int id;
for(int j=1;j<=n;j++){
char mi='z';
int num=0;
for(int i=1;i<=n;i++){
if(vis[i]) continue;
if(a[i][j]<mi){
mi=a[i][j];
num=1;
id=i;
}
else if(a[i][j]==mi) num++;
}
if(num==1){
flag=1;
for(int i=1;i<=n;i++) printf("%c",a[id][i]);
printf("\n%d\n",id);
break;
}
else{
for(int i=1;i<=n;i++){
if(vis[i]) continue;
if(a[i][j]>mi) vis[i]=1;
}
}
}
if(!flag){
for(int j=1;j<=n;j++) printf("%c",a[id][j]);
printf("\n%d\n",id);
}
}
return 0;
}
题意:给出两个多项式a,b的系数,两个多项式相乘后的多项式为c,求任意一个下标t,该位置的系数不能被p整除
题解:
设t=i+j,i为a[]第一个不被p整除的下标,j为b[]第一个不被p整除的下标
t位置的系数=a[0]*b[i+j]+a[1]*b[i+j-1]...a[i]*b[j]...a[i+j]*b[0]
a[0]到a[i-1]每一个都能被p整除,b[0]到b[j-1]每一个都能被p整除
所以上面的式子只有a[i]*b[j]这个式子不被p整除,其他都是p的倍数,去掉即可
这样最后系数=a[i]*b[j],这一定不能被p整除
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
inline int read()
{
register int X=0;
register char ch=0;
while(ch<48||ch>57)ch=getchar();
while(ch>=48&&ch<=57)X=X*10+(ch^48),ch=getchar();
return X;
}
int a[maxn],b[maxn];
int main()
{
ll n,m,p;
scanf("%lld%lld%lld",&n,&m,&p);
for (int i=0;i<n;i++)a[i]=read();
for (int i=0;i<m;i++)b[i]=read();
int x=-1,y=-1;
for(int i=0;i<n;i++){
if(a[i]%p!=0){
x=i;
break;
}
}
for(int i=0;i<m;i++){
if(b[i]%p!=0){
y=i;
break;
}
}
printf("%d\n",x+y);
return 0;
}
题意:
n*n的矩阵,每个单元mp[][]是L,R,U,D,X中的一种,分别代表往左,右,上下走,不动。输入a[][]的矩阵代表每个单元,从该单元开始到某个单元结束停止不动的坐标。(-1,-1),代表从该单元走陷入了死循环。给你a[][]矩阵,让你反推mp[][]看是否存在
题解:
分类讨论
1)不是陷入死循环的单元。当每个单元的坐标等于该单元终点的坐标时,将该单元放入队列,然后从该单元反推开始bfs()
2)陷入死循环的单元。不需要从开头一直走,一直走,再走回开头。只需要让该单元与相邻也是(-1,-1)的单元这两个单元陷入死循环即可,然后bfs2()让其他(-1,-1)的点走到这两个单元就行
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1050;
struct node{
int x,y;
}a[maxn][maxn];
int vis[maxn][maxn],dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}},n;
char mp[maxn][maxn];
char d1[10]="RDLU",di[10]="LURD";
int solve(node x){
return ((a[x.x][x.y].x-1)*n+a[x.x][x.y].y);
}
queue<node>q;
node v;
void bfs(){
while(!q.empty()){
node u=q.front();q.pop();
for(int i=0;i<4;i++){
v.x=u.x+dir[i][0];v.y=u.y+dir[i][1];
if(v.x<1||v.y<1||v.x>n||v.y>n||vis[v.x][v.y]||a[v.x][v.y].x==-1) continue;
if(solve(v)==vis[u.x][u.y]){
vis[v.x][v.y]=solve(v);
mp[v.x][v.y]=di[i];
q.push(v);
}
}
}
}
void bfs2(){
while(!q.empty()){
node u=q.front();q.pop();
for(int i=0;i<4;i++){
v.x=u.x+dir[i][0];v.y=u.y+dir[i][1];
if(v.x<1||v.y<1||v.x>n||v.y>n||vis[v.x][v.y]||a[v.x][v.y].x!=-1) continue;
vis[v.x][v.y]=1;
mp[v.x][v.y]=di[i];
q.push(v);
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d%d",&a[i][j].x,&a[i][j].y);
if(a[i][j].x==i&&a[i][j].y==j){
vis[i][j]=(i-1)*n+j;
q.push(a[i][j]);
mp[i][j]='X';
}
}
}
bfs();
int flag=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j].x!=-1||vis[i][j]) continue;
int num=0;
for(int ii=0;ii<4;ii++){
v.x=i+dir[ii][0];v.y=j+dir[ii][1];
if(v.x<1||v.y<1||v.x>n||v.y>n||vis[v.x][v.y]||a[v.x][v.y].x!=-1) continue;
vis[v.x][v.y]=1;vis[i][j]=1;
mp[i][j]=d1[ii];mp[v.x][v.y]=di[ii];
q.push(v);
v.x=i;v.y=j;q.push(v);
num=1;
break;
}
if(!num){
flag=1;
break;
}
bfs2();
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(vis[i][j]==0){
flag=1;
break;
}
}
}
if(flag){
printf("INVALID\n");
return 0;
}
printf("VALID\n");
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%c",mp[i][j]);
}
printf("\n");
}
return 0;
}