这次训练赛有好几个坑,其中猜数字我真的不会做。都是在网上找来的代码。其中含义还希望读者能自己琢磨吧!(自身现在也是一知半解,至于怎么出来的想法望各位大牛能提点提点)。
3 4
10 10 2
18 1 9
2 1 12
8 6 10
162
第一批乘客发出请求到离开电梯所需时间:3*2+6+3*11+6=51 从前一批乘客离开电梯到第二批乘客离开电梯所需时间:3*6+6+3*4+6=42 第三批乘客从出发地出发到离开电梯所需时间:
3*8+6=30(由于出发地与前一批乘客目的地相同,所以上下客时间不必再加 6) 从前一批乘客离开电梯到第四批乘客离开电梯所需时间:3+6+3*8+6=39 总花费时间:51+42+30+39=162
#include
#include
#include
using namespace std;
typedef struct point{
int num,t,s,f;
}p;
p a[110];
int cmp(p x,p y){
return x.t
4 3
1024
010
1124
b 中的一个 1 和 a 中的第二位上的 0 进行交换。
对于 20%的数据 1≤n,m≤10
对于 50%的数据 1≤n,m≤2000
对于 100%的数据 1≤n,m≤100000
#include
#include
using namespace std;
int main()
{
int str[11]={0},n,m;
char a[100050],b[100050];
scanf("%d %d\n",&n,&m);
scanf("%s",a);
scanf("%s",b);
for(int i=0;i=0;j--){
if(a[i]<(j+'0')&&str[j]){
a[i]=(j+'0');
str[j]--;
break;
}
}
}
printf("%s\n",a);
return 0;
}
11
wbrrbbwbrbb
6
将 1 号珠子看成蓝色,则在 2 和 3 号珠子之间剪断,味味可得到的 6 颗珠子编号分别为1、2、3、4、10、11;也可在 4 和 5 号珠子间剪断,将 7 号珠子看成蓝色,则味味可得到珠子的编号为 3、4、5、6、7、8。
对于 60%的数据 3≤n≤100
对于 100%的数据 3≤n≤350
#include
#include
using namespace std;
int main()
{
int n,ans=0;
char a[10000];
scanf("%d",&n);
scanf("%s",a);
for(int i=0;i=0;j--){
if(a[j]=='w'){
l++;
}else if(ch1==a[j]){
l++;
}else{
if(ch1=='w'){
ch1=a[j];
l++;
}else{
break;
}
}
}
for(int j=i+2;j<=3*n;j++){
if(a[j]=='w'){
r++;
}else if(ch2==a[j]){
r++;
}else{
if(ch2=='w'){
r++;
ch2=a[j];
}else{
break;
}
}
}
ans=max(r+l,ans);
}
ans=min(ans,n);
printf("%d\n",ans);
return 0;
}
2
90
09
如果味味心中想的是 09,则 S=09+90-09=9+90-9=90,符合要求。
对于 20%的数据 n≤3
对于 60%的数据 n≤5
对于 100%的数据 2≤n≤11 ,0≤S≤1018
#include
#include
#include
#include
#include
using namespace std;
long long tmp[20];
long long first[20];
long long remain;
int n;
void init()
{
tmp[1]=1;
for (int i=2; i<=12; ++i)
tmp[i]=tmp[i-1]*10+1;
cin >> n;
cin >> remain;
for (int i=0; i<=9; ++i)
first[i]=i*tmp[n];
}
void print(long long x,long long y,long long z)
{
for (int i=1; i<=n-1; ++i)
y*=i;
long long k1=0,k2=1;
for (int i=1; i<=n; ++i)
{
k1+=k2*y;
k2*=10;
}
if (k1-x!=remain) return;
int c[20];
int pos=0;
memset(c,0,sizeof(c));
while (x>0)
{
c[pos++]=x%10;
x/=10;
}
for (int i=n-1; i>=0; --i)
cout << c[i];
cout << endl;
exit(0);
}
void solve()
{
int ll=1;
for (int i=1; i<=n-1; ++i) ll*=i;
for (int i=0; i<=n*9; ++i)
{
for (int j=0; j<=9; ++j)
{
long long second=first[j]*i*ll;
long long third=second-remain;
long long w = third;
int x=0;
while (w>0)
{
x+=w%10;
w/=10;
}
if (x==i && third>0) print(third,i,j);
}
}
}
int main()
{
init();
solve();
}
6
0 0 0 0 0 0
0 0 1 0 0 0
1 0 0 0 1 0
0 0 0 0 0 0
0 1 0 0 0 1
0 0 0 0 0 0
1 1
3 4
5 5
4 6
2 3
0 0
-1 -1 0 0 0 0
-1 -1 -2 -1 -1 0
1 0 -1 -1 -2 0
0 0 -1 -1 -1 -1
0 1 0 -1 -1 -2
0 0 0 -1 -1 -1
模拟即可。
#include
#include
int G[55][55],a[55][55],vis[55][55],flag=1,cnt1,cnt2,n;
void tu(int x,int y){
if(x<=0||x>n||y<=0||y>n){
return ;
}
if(vis[x][y]==0&&a[x][y]==1){
vis[x][y]=1;
cnt2++;
}
if(a[x][y]==1){
G[x][y]=-2;
}else{
G[x][y]=-1;
}
}
int check(int x,int y){
int ans=0;
for(int i=x-1;i<=x+1;i++){
for(int j=y-1;j<=y+1;j++){
tu(i,j);
}
}
}
int ck(int x,int y){
if(a[x][y]==1){
return 0;
}else if(a[x][y]==0&&G[x][y]==0)
check(x,y);
else{
return 1;
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&a[i][j]);
if(a[i][j]==1){
cnt1++;
}
}
}
int tx,ty;
while(~scanf("%d%d",&tx,&ty),(tx||ty)){
if(G[tx][ty]==-1||G[tx][ty]==-2){
continue;
}
if(ck(tx,ty)==0){
printf("GAME OVER!\n");
return 0;
}
if(cnt2==cnt1){
printf("YOU ARE WINNER!\n");
return 0;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(G[i][j]==0&&a[i][j]==1){
G[i][j]=1;
}
printf("%d%c",G[i][j],j==n?'\n':' ');
}
}
return 0;
}
3
1 2
2 3
3
2
3
节点1为根时,树的形态如下,此时树高为3。
节点2为根时,树的形态如下,此时树高为2。节点3为根时树的形态同于节点1为根情形。
对于30%的数据有N≤100。
对于60%的数据有N≤300。
对于100%的数据有1≤N≤1000,1≤a,b≤N
#include
using namespace std;
int n,g[2000],tot,depth[2000],MAX;
struct tree{
int t,next;
}e[500000];
void addedge(int a,int b){
e[++tot].t=b;
e[tot].next=g[a];
g[a]=tot;
}
void dfs(int x,int father){
depth[x]=depth[father]+1;
MAX=max(MAX,depth[x]);
for(int i=g[x];i;i=e[i].next){
if(e[i].t!=father){
dfs(e[i].t,x);
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i
4
28 41
4=(2-1)×(4-2)×(4-2) 最少剩余的小积木块为 2×4×4-4=28(此时 A,B,C 值分别为 2,4,4)
4=(5-1)×(3-2)×(3-2) 最多剩余的小积木块为 5×3×3-4=41(此时 A,B,C 值分别为 5,3,3)
对于 20%的数据 1 ≤n≤400
对于 50%的数据 1 ≤n≤106
对于 100%的数据 1 ≤ n≤109
#include
#include
#include
2 7
33
next(2)+next(3)+next(4)+next(5)+next(6)+next(7)=4+4+4+7+7+7=33
对于 20%的数据,1≤L≤R≤1000
对于 40%的数据,1≤L≤R≤106
另有 20%的数据,L=R
对于 100%的数据,1≤L≤R≤109
#include
using namespace std;
typedef long long ll;
ll luck[10000];
int cnt;
int a[2]={4,7};
typedef struct point{
ll x,step;
}p;
void bfs(){
queueq;
p first={0,0};
q.push(first);
while(!q.empty()){
p cur=q.front();
q.pop();
p next;
if(cur.step==11){
return ;
}
for(int i=0;i<2;i++){
next.x=cur.x*10+a[i];
next.step=cur.step+1;
q.push(next);
luck[++cnt]=next.x;
}
}
}
int main()
{
bfs();
ll L,R,ans=0;
int k=0;
scanf("%lld %lld",&L,&R);
for(int i=0;i<=1024;i++){
if(luck[i]>=L){
k=i;break;
}
}
for(int i=L;i<=R;i++){
if(i>luck[k]){
k++;
}
ans+=luck[k];
}
printf("%lld\n",ans);
return 0;
}
3 3
1 2 3
1 2
2 3
3 1
6
In the first test there only are three pieces of clothing and they all match each other. Thus, there is only one way — to buy the 3 pieces of clothing; in this case he spends 6 roubles.
#include
using namespace std;
typedef long long ll;
ll n,m,price[1100];
int main()
{
ll ans=99999999;
int G[110][110]={0},l,r;
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&price[i]);
}for(int i=1;i<=m;i++){
scanf("%d%d",&l,&r);
G[l][r]=G[r][l]=1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
if(G[i][j]+G[i][k]+G[k][j]==3){
ans=min(ans,price[i]+price[j]+price[k]);
}
}
}
}
if(ans==99999999){
printf("-1\n");
}else{
printf("%lld\n",ans);
}return 0;
}
991
3
The test contains number 991. As one casts a spell the following transformations take place: 991 → 19 → 10 → 1. After three transformations the number becomes one-digit.
#include
#include
typedef long long ll;
int main()
{
char str[1005000],a[1000002];
scanf("%s",str);
ll t=0,ans=1;
int len=strlen(str);
for(int i=0;i
#include
#include
#include
using namespace std;
char str[1000000];
int f(int p) {
return (p == 0) ? 0 : (p%10 + f(p/10));
}
int main(void) {
scanf("%s", str);
if (strlen(str) == 1) {
printf("0\n");
return 0;
}
int cnt = 0;
for (char *i = str; *i; i++) {
cnt += (*i - '0');
}
int res = 1;
while (cnt >= 10) {
cnt = f(cnt);
++res;
}
printf("%d\n", res);
return 0;
}