40min补完了这三题。。
然后后面2道题,小茫然。等高数考完再补吧。。
Machine
想想就知道是三进制,但是题解的方法更简单,我弱弱的方法也过了。。
#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string test;
int main()
{
long long T;
scanf("%I64d",&T);
while(T--)
{
long long num,change;
scanf("%I64d%I64d",&num,&change);
test.clear();
while(change)
{
if(change%3==0)
{
test=test+'0';
}
else if(change%3==1)
{
test=test+'1';
}
else
{
test=test+'2';
}
change=change/3;
}
long long len=test.size();
//cout<<test<<endl;
reverse(test.begin(),test.end());
//cout<<test<<endl;
len++;
if(len>num)
{
len--;
//cout<<test<<endl;
for(long long i=len-num;i<len;i++)
{
if(test[i]=='0')
{
printf("R");
}
else if(test[i]=='1')
{
printf("G");
}
else
{
printf("B");
}
}
}
else
{
len--;
for(long long i=1;i<=num-len;i++)
{
printf("R");
}
for(long long i=0;i<len;i++)
{
if(test[i]=='0')
{
printf("R");
}
else if(test[i]=='1')
{
printf("G");
}
else
{
printf("B");
}
}
}
printf("\n");
}
return 0;
}
B 简单的模拟。。
题解的方法似乎比我少开2个数组,膜拜。。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int MAXN=10010;
int whon[MAXN];
int whom[MAXN];
int way[MAXN][MAXN];
int flagn[MAXN];
int flagm[MAXN];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m,num;
scanf("%d%d%d",&n,&m,&num);
for(int i=1;i<=n;i++)
{
whon[i]=i;
}
for(int j=1;j<=m;j++)
{
whom[j]=j;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&way[i][j]);
}
}
memset(flagm,0,sizeof(flagm));
memset(flagn,0,sizeof(flagn));
int a,how,b;
while(num--)
{
scanf("%d%d%d",&how,&a,&b);
if(how==1)
{
int t=whon[a];
whon[a]=whon[b];
whon[b]=t;
}
else if(how==2)
{
int t=whom[a];
whom[a]=whom[b];
whom[b]=t;
}
else if(how==3)
{
flagn[whon[a]]=flagn[whon[a]]+b;
}
else if(how==4)
{
flagm[whom[a]]=flagm[whom[a]]+b;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
printf("%d",way[whon[i]][whom[j]]+flagn[whon[i]]+flagm[whom[j]]);
if(j==m)
{
printf("\n");
}
else
{
printf(" ");
}
}
}
}
return 0;
}
C 前后2个指针走一下就好了,网上似乎把这东西叫做尺取法。。(为何有种还是模拟的感觉),数组开小居然是超时也是醉了。。于是一直在自己写的,和别人的,实质一样的,写法不一样的地方纠结。。。map慢好多,要880+ms。。但是一旦变成 减‘a’,就是200ms了。。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
const int maxn=1000100;
char a[maxn];
map<char,int>all;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int num;
scanf("%s",a);
scanf("%d",&num);
int len=strlen(a);
int left=0,right=0;
long long ans=0;
int t=0;
all.clear();
while(1)
{
while(t<num&&right<len)
{
if(!all[a[right]])
{
t++;
}
all[a[right]]++;
right++;
}
if(t<num)
break;
while(1)
{
ans=ans+(len-right+1);
all[a[left]]--;
left++;
if(!all[a[left-1]])
break;
}
t--;
}
printf("%I64d\n",ans);
}
return 0;
}