zoukankan      html  css  js  c++  java
  • codeforces B. Simple Molecules 解题报告

    题目链接:http://codeforces.com/problemset/problem/344/B

    题目意思:这句话是解题的关键: The number of bonds of an atom in the molecule must be equal to its valence number。 给定三个原子的化学价,规定化学价数等于该原子与另外两个原子所连接的原子键之和。

           又一次把简单问题复杂化了.....(以下注释部分读者可以忽略)

          /*

           一开始三重循环枚举,绝对超时(10^6 * 10^6 * 10^6),不敢提交!!后来甚至想到这三个原子构成的原子键与总的化学价数成两倍关系(貌似没什么用,也好像不太正确,最后觉得无法实施,没深究下去了)......昨天上课再想,想到把这三个数从小到大排序,然后枚举最小和次小的原子的原子键,这样枚举出的值最大也不会超过最小的那个原子的价数,知道其中两个原子的原子键后,其余两个原子键自然就能计算出来。(例如8  3 11,3和8连接的原子键最大只可能是3)这样做,虽然在一般情况下(不考虑极端的10^6),枚举的范围小了,然而这三个原子的输入顺序在排序的过程中被改变了,用结构体保存原来输入的序号?越来越不可行了......

       */

        今天硬着头皮,做好TLE的心理准备,不排序直接枚举(1~10^6)输入的前两个数的原子键数,一旦发现直接输出。其实三个原子键构成这样一个关系:假设输入的是a,b,c,枚举a,b之间的原子键数i(0<= i <= 10^6 )。想到b、c原子键数符合:b - i ;a、c之间的原子键符合:a - i。最后如果符合 (a -  i ) + (b - i ) = c,即找出一组解。

      

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 using namespace std;
     5 
     6 const int maxn = 1e6 + 10;
     7 
     8 int main()
     9 {
    10     int a, b, c, i;
    11     while (scanf("%d%d%d", &a, &b, &c) != EOF)
    12     {
    13         int flag = 0;
    14         for (i = 0; i <= maxn; i++)
    15         {
    16             if (a + b - 2 * i == c && b-i >= 0 && a-i >= 0)   // 一定要判断 b-i 和 a-i 的取值,负数的需要排序
    17             {
    18                 flag = 1;  // 找出一组解,直接跳出循环
    19                 printf("%d %d %d\n", i, b-i, a-i);
    20                 break;    
    21             }
    22         }
    23         if (!flag)
    24             printf("Impossible\n");
    25     }
    26     return 0;
    27 }
  • 相关阅读:
    素数筛相关
    ACM-ICPC 2017 Asia Shenyang
    codeforces/contest/1228
    Python 支持的编码格式列表
    Python——json格式数据与字典相互转换
    mysql 数据查询基本语法
    Python 奇葩问题总结;
    Python中的Subprocess模块 python 命令行操作 系统任务管理 执行系统命令
    C++ Json打包数据 查看数据
    mysql数据无法读出 idb文件恢复数据
  • 原文地址:https://www.cnblogs.com/windysai/p/3325752.html
Copyright © 2011-2022 走看看