SGU水题大集合 SGU104 SGU105 SGU107

10 篇文章 0 订阅

【SGU水题】

【SGU104】

【题目描述】 你想把你花店的窗户规划的好看一些,毕竟你是一个专业的卖动态仙人掌的人。今有F束花朵,每一束那都是不同种类的花儿,而且一排有许多花瓶。这1到V个花瓶被胶在架子上(你也是醉了),当然V就是这个架子上花瓶的个数(SGU原文就是这样:where V is the number of vases),然后我们是从左往右编号的,即1是最左边的一个,V是最右边一个。然而每一束花朵都是可以移动滴且我们也对他们标记成1..F,且这些编号如下意义:编号小的必须出现在编号大的左边。有如下例子,今有三种花:杜鹃(1),秋海棠(2),康乃馨(3).<span style="color:#ff0000;">现在它们必须按顺序放在花瓶里面</span>,每束杜鹃都必须在秋海棠的左边,同理每束秋海棠都必须在康乃馨的左边,如果花瓶比花束多【事实上你作为一个土豪花瓶数量总是比花多的】,显然有一些花瓶会空。由于你是一个高级强迫症患者,你最讨厌用东西混在一起,<span style="color:#ff0000;">所以一个花瓶里面只能有一束花 </span> 
  每一个花瓶都会有自己的特征(就好似那美丽的花儿)。因此,我们赋予了花儿与花瓶搭配后的一个美观值(毕竟你不能用脚丫子卖动态仙人掌,毕竟不美观),美观值是一个整数。下面就给出了一张美观值的表,当花瓶里没有花的时候美观值就为0(虽然我觉得空花瓶好看)  
  在这张表中显然杜鹃花和2号花瓶很配,而与4号花瓶充满了不协调之感。  为了实现中华民族的伟大复兴,社会主义现代化,实现中国梦,你要为社会做贡献,即在社会主义核心价值观的影响之下,你要找到一种合理的摆花方案使得其的美观值总和最大。当然如果有很多种规划方案,你给出任意一个即可,毕竟这是你的花店。
<pre name="code" class="plain">【数据规模约定】
F<=100F<=V<=100-50<=Aij<=50 
Aij为把第i束花放进j花瓶的美观度
【输入】第一行两个整数 F,V下接F行每行V个整数,对于第i+1行的第j个数是将第i束花插入第j个花瓶的美观度。
【输出】第一行 最大美观度第二行 共F个整数,第i个整数表示第i束花所放花瓶的编号

 

好吧,SGU104真的是 N^3真的是暴力写【C党无力吐槽】

</p><p><pre name="code" class="cpp">#include <stdio.h>
#include <stdlib.h>
#define MAXN 104
int dp[MAXN][MAXN]={0};
int father[MAXN][MAXN]={0};
int a[MAXN][MAXN]={0};
int f,v;
void open()
{
  freopen("104.in","r",stdin);
  freopen("104.out","w",stdout);
}
void close()
{
  fclose(stdin);
  fclose(stdout);
}
void init()
{
  int i,j;
  scanf("%d%d",&f,&v);
  for (i=1;i<=f;i++)
    for (j=1;j<=v;j++)
      scanf("%d",&a[i][j]);
 for (i=1;i<=v;i++)
 {
   dp[1][i]=a[1][i]; 
 }
}
void print(int n,int x)
{
  if (n==0)
    return ;
  print(n-1,father[n][x]);
  printf("%d ",x);
}
void work()
{
  int i,j,k,maxi;
  for (i=2;i<=f;i++)
  {
    dp[i][i]=dp[i-1][i-1]+a[i][i];
    father[i][i]=i-1;
    for (j=i+1;j<=v;j++)
    {
      dp[i][j]=-2e8;
      for (k=i-1;k<j;k++)
        if (dp[i][j]<dp[i-1][k]+a[i][j])
        { 
		  dp[i][j]=dp[i-1][k]+a[i][j];
		  father[i][j]=k;
	    }
	}
  }
  maxi=f;
  for (i=f;i<=v;i++)
    if (dp[f][maxi]<dp[f][i])
      maxi=i;
  printf("%d\n",dp[f][maxi]);
  print(f,maxi);
}
int main()
{
  open();
  init();
  work();
  close();
  return 0;
}
注意一点,有一些逗比的东西 我的题目描述中讲了这些细节【绝版良心题目描述!】


【SGU105】

There is sequence 1, 12, 123, 1234, ..., 12345678910, ... . Given first N elements of that sequence. You must determine amount of numbers in it that are divisible by 3.

这种英文连我这种小学生都能看懂。我就不翻译了,太水的题目,直接代码!找规律就可以了!

/*
计算1 12 123 1234 ……
前n项里被三整除的数
被三整除就是各数位之和能被三整除
观察到三个一组 1 12 123
               1234 12345 123456
			   ……
共有2个可以整除(即后面两个) 
*/ 
#include <stdio.h>
#include <stdlib.h>
int n;
int main()
{
  scanf("%d",&n);
  printf("%d",(n/3)*2+(n%3==2));
  return 0;
}


【SGU107】

这道题是找规律,我们的方法就是打表+目测

#include <cstdio>
#include <cmath>

int main()
{
//    for(long long i=sqrt(987654321.0);i<=999999999;++i)
//        if( i*i%1000000000 == 987654321 )
//            printf("%d\n",i);
//    111111111
//    119357639
//    380642361
//    388888889
//    611111111
//    619357639
//    880642361
//    888888889

    int n;

    while (scanf("%d",&n)!=EOF)
    {
        if (n<=8)
            printf("0\n");
        else if (n==9)
            printf("8\n");
        else
        {
            printf("72");
            for (int i=0;i<n-10;++i)
                putchar('0');
            putchar('\n');
        }
    }

}
蒽,几道大水题!大家可以去刷了!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值