Drink

对于每一种饮料,都可以算出最少需要多少瓶,从而知道最少摄入多少卡路里,从中找个最优值。

#include <iostream>
#include <cstdio>using namespace std;int main() {int T;cin >> T;while(T--) {int n,m,x[200],y[200];cin >> n >> m;int ans = -1;for (int i = 1; i <= n; i++) {cin >> x[i] >> y[i];int tp = y[i] * (m/x[i] + ((m%x[i])?1:0));if (ans==-1 || tp < ans)ans = tp; }cout << ans << "\n";}return 0;
}

GPA

暴力做法:枚举四门课的成绩,按规则算算GPA。 优秀做法:对于每一档绩点,分数取最低一定是最优的,那么我们就可以用枚举分数的档次取代枚举具体的分数。

我直接打表了

#include <iostream>
#include <cstdio>using namespace std;
double ans[] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.7,1.7,1.7,2.0,2.0,2.3,2.3,2.3,2.7,2.7,2.7,2.7,2.7,3.0,3.0,3.0,3.0,3.0,3.3,3.3,3.3,3.3,3.3,3.7,3.7,3.7,3.7,3.7,4.0,4.0,4.0,4.0,4.0,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.3,4.4,4.4,4.6,4.7,4.7,5.0,5.0,5.0,5.4,5.4,5.4,5.4,5.4,5.7,5.7,5.7,5.7,5.7,6.0,6.0,6.0,6.0,6.0,6.4,6.4,6.4,6.4,6.4,6.7,6.7,6.7,6.7,6.7,7.0,7.0,7.0,7.0,7.0,7.4,7.4,7.4,7.4,7.4,7.7,7.7,7.7,7.7,7.7,8.0,8.0,8.0,8.0,8.0,8.3,8.3,8.3,8.3,8.3,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.6,8.7,8.7,8.7,8.7,8.7,9.1,9.1,9.1,9.1,9.1,9.4,9.4,9.4,9.4,9.4,9.7,9.7,9.7,9.7,9.7,10.1,10.1,10.1,10.1,10.1,10.4,10.4,10.4,10.4,10.4,10.7,10.7,10.7,10.7,10.7,11.1,11.1,11.1,11.1,11.1,11.4,11.4,11.4,11.4,11.4,11.7,11.7,11.7,11.7,11.7,12.0,12.0,12.0,12.0,12.0,12.3,12.3,12.3,12.3,12.3,12.6,12.6,12.6,12.6,12.6,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,12.9,13.1,13.1,13.1,13.1,13.1,13.4,13.4,13.4,13.4,13.4,13.8,13.8,13.8,13.8,13.8,14.1,14.1,14.1,14.1,14.1,14.4,14.4,14.4,14.4,14.4,14.8,14.8,14.8,14.8,14.8,15.1,15.1,15.1,15.1,15.1,15.4,15.4,15.4,15.4,15.4,15.7,15.7,15.7,15.7,15.7,16.0,16.0,16.0,16.0,16.0,16.3,16.3,16.3,16.3,16.3,16.6,16.6,16.6,16.6,16.6,16.9,16.9,16.9,16.9,16.9,17.2,17.2,17.2,17.2,17.2,17.2,17.2,17.2,17.2,17.2,17.2,17.2,17.2,17.2,17.2,17.2,17.2,17.2,17.2,17.2,17.2};double f(int x) {if (x>=95) return 4.3;if (x>=90) return 4.0;if (x>=85) return 3.7;if (x>=80) return 3.3;if (x>=75) return 3.0;if (x>=70) return 2.7;if (x>=67) return 2.3;if (x>=65) return 2.0;if (x>=62) return 1.7;if (x>=60) return 1.0;return 0;
}void work() {int x;cin >> x;
/*  double ans = 0;for (int i = 0; i <= min(x,100); i++)for (int j = i; j <= min(x-i,100); j++)for (int k = j; k <= min(x-i-k,100); k++)for (int t = k; t <= x-i-j-k; t++)ans = max(ans,f(i)+f(j)+f(k)+f(t));*/printf("%.1f\n",ans[x]);
}int main() {int T;cin >> T;while(T--) work();return 0;
}

Dec

用 f[i][j] 表示第一个数字从 i 开始减,第二个数字从 j 开始减的情况下最多有多少对互质的数字,f[i][j] 从 f[i-1][j]或 f[i][j-1]转移过来。

#include <iostream>
#include <cstdio>using namespace std;int f[1001][1001];
int g[1001][1001];int gcd(int x,int y) {if(g[x][y]) return g[x][y];return g[x][y]=g[y][x]=(y==0?x:gcd(y,x%y));
}int main() {for (int i = 1; i <= 1000; i++)for (int j = 1; j <= 1000; j++) {f[i][j] = max(f[i-1][j],f[i][j-1]);if (gcd(i,j)==1) f[i][j]++; }//  return 0;int T;cin >> T;while(T--) {int x,y;scanf("%d%d",&x,&y);printf("%d\n",f[x][y]);} return 0;
}

Civilization

枚举去哪个位置建设城市,人口一定放在食物多的地方,剩下的只要算下人口增长情况就可以了。

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;int n,x,y;
int a[600][600];
int dis[600][600];int xx[] = {0,0,0,1,-1,1,1,-1,-1,2,0,-2,0};
int yy[] = {0,1,-1,0,0,1,-1,1,-1,0,2,0,-2};int setcity(int x,int y) {int time = 0,p3 = 0,p2 = 0,p1 = 0,p0 = 0,p = 1,sum = 0;int cnt[4];cnt[1] = cnt[2] = cnt[3] = 0;for (int i = -3; i <= 3; i++)for (int j = -3; j <= 3; j++)if (abs(i)+abs(j) <= 3)if (x+i>0 && x+i<=n && y+j>0 && y+j<=n)cnt[a[x+i][y+j]]++;if (a[x][y] == 3) p3++,cnt[3]--;if (a[x][y] == 2) p2++,cnt[2]--;if (a[x][y] == 1) p1++,cnt[1]--;
//cout<<a[x][y]<<" "<<cnt[1] << " "<<cnt[2]<<" "<<cnt[3]<<" \n";while (p < 9) {sum += p1+p2*2+p3*3;time++;if (sum >= 8*p*p) {p++;if (cnt[3]) {p3++;cnt[3]--;} else if (cnt[2]) {p2++;cnt[2]--;} else if (cnt[1]) {p1++;cnt[1]--;} else p0++; }}return time;
}bool inq[600][600];
void bfs(int x,int y) {queue<int> qx;queue<int> qy;qx.push(x);qy.push(y);memset(inq,0,sizeof inq);memset(dis,127/3,sizeof dis);dis[x][y] = 0;inq[x][y] = 1;while(qx.size()) {int tx = qx.front(); qx.pop();int ty = qy.front(); qy.pop();inq[tx][ty] = 0;for (int k = 0; k < 13; k++) {int x = tx + xx[k];int y = ty + yy[k];if (x <= 0 || y <= 0 || x>n || y>n)  continue;if (dis[x][y] > dis[tx][ty]+1) {dis[x][y] = dis[tx][ty]+1;if (inq[x][y] == 0) {inq[x][y] = 1;qx.push(x); qy.push(y);}}}}
}void work() {scanf("%d%d%d",&n,&x,&y);for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++) scanf("%d",&a[i][j]);int ans = 1e7; bfs(x,y);for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)ans = min(ans,setcity(i,j)+dis[i][j]);printf("%d\n",ans);
}int main() {int T;cin >> T;while(T--) work();return 0;
}

Rotate

我再解释一下吧a[i-1]作为新连通块(即和a[i]无相交)黑块的个数,这层黑块有a[i-1]/2个,因为每层都是黑白相间,黑块完全包含在外层黑块中和完全包含在外层白块上概率一样,完全包含在外层白块上再加上在黑白交界的一半就是a[i-1]/4个。

那黑白交界处的数量是什么?a[i]/2个,外层每个黑块两个边,每个边对应内层1/2概率黑,1/2概率白

#include <iostream>
#include <cstdio>using namespace std;typedef long long ll;void exgcd(ll a, ll b, ll &x, ll &y)    //拓展欧几里得算法
{if(!b) x = 1, y = 0;else{exgcd(b, a % b, y, x);y -= x * (a / b);}
}ll niyuan(ll a, ll b)   //求a对b取模的逆元
{ll x, y;exgcd(a, b, x, y);return (x + b) % b;
}ll p = 1e9+7;int a[20];int main() {//ll a = int T;cin >> T;while(T--) {int n;cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];}cout << (a[1]+a[n])*niyuan(4,p)%p << "\n";}// cout << 505 * niyuan(2,p) %p;return 0;
}

后面没写...

2020 年百度之星·程序设计大赛 - 初赛一题解相关推荐

  1. 2020年百度之星·程序设计大赛-初赛一

    Pro.ID 1001 Drink 题解 1002 GPA 题解 1003 Dec 题解 1004 Civilization 1005 Rotate 题解 1006 Matrix 1007 Mosqu ...

  2. 2020 年百度之星·程序设计大赛 - 初赛一 Civilization BFS广搜

    problem Civilization Accepts: 619 Submissions: 2182 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  3. 2020 年百度之星·程序设计大赛 - 初赛一 Dec 二维DP,预处理

    problem Dec Accepts: 1284 Submissions: 4572 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327 ...

  4. 2020 年百度之星·程序设计大赛 - 初赛一 GPA DFS深搜

    problem GPA Accepts: 1554 Submissions: 3947 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327 ...

  5. 2020 年百度之星·程序设计大赛 - 初赛一 Drink

    Problem Description 我们有 nn 种不同的饮料,每种饮料有无限多瓶,第 ii 种饮料一瓶提供 x[i]x[i] 毫升的水分,包含 y[i]y[i] 卡路里. 现在我们需要选择一种饮 ...

  6. 2020 年百度之星程序设计大赛 - 初赛二

    Poker Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Subm ...

  7. 1001. Poker (思维 / 模拟)(2020年百度之星*程序设计大赛-初赛二)

    传送门 思路: 嗐,又是这种模拟题,每次都不长记性看数据范围,非得傻傻的去循环模拟T一次才知道思考.呜呜呜太菜了. 既然每次至少拿出m,且求的是最多次数,那我们每次就拿m出来. 先将m * p%上取整 ...

  8. 2020年百度之星·程序设计大赛 - 初赛一(前三题)

    文章目录 Drink[贪心] 题目描述 测试样例 解题思路 赛时AC代码 赛后优化AC代码 总结: GPA[枚举] 题目描述 测试样例 解题思路 赛时WA代码 赛时AC代码 总结: Dec[反向dp+ ...

  9. 2020 年百度之星·程序设计大赛 - 初赛三-Discount

    Discount Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Subm ...

最新文章

  1. ubuntu/linuxmint如何添加和删除PPA源
  2. android listView嵌套gridview的使用心得
  3. ZNNT-5NM 扭矩测量模块
  4. [Web安全之实战] 跨站脚本攻击XSS
  5. windows server 2003上安装mysql的问题
  6. python凯撒密码加密写入文件_Python用户名密码登录系统(MD5加密并存入文件,三次输入错误将被锁定)及对字符串进行凯撒密码加解密操作...
  7. 【6 插值方法】实例实战篇
  8. 小白信用卡提额攻略,2年轻松提额20万!
  9. ARMA模型的性质 1
  10. react 父子传值_React父子组件间的传值
  11. lua 给userdata设置元表_UE4热更新:基于UnLua的Lua编程指南
  12. FTP原理和修改FTP默认端口
  13. NX文件名与工程图名自动关联
  14. OSChina 周六乱弹 ——致敬默默守护国运的男人们
  15. [转载]C++URL编码转换
  16. 实验三 面向对象(二)(预习报告)
  17. 紧随时代的步伐--Java8特性之接口默认方法
  18. rust潘通色_[转载]PANTONE(潘通色卡)TPX/TCX色号颜色查询--以后不用愁啦!!!...
  19. 自适应步长快速对抗训练
  20. 浙江省高级工程师职称评审条件

热门文章

  1. MySQL环境变量的配置(三)(Windows 11)
  2. 美元指数是什么,为什么会对伦敦金有影响
  3. ASEMI整流桥KBP410参数,KBP410厂家,KBP410货源
  4. ORA-04031: 无法分配 3840 字节的共享内存 (“shared pool“,“unknown object“,“sga heap(1,0)“,“kglsim object batch“)
  5. 深入剖析 grep 命令
  6. 【机友会选手机攻略】合约机是什么?和裸机有什么区别?0元购机和购机入网送话费区别?...
  7. 别看了!我们该认认真真写博客了…
  8. 很全的敏感词匹配系统的设计与实践
  9. “SEO是什么意思?”Kyw的通俗回答
  10. PHP单例模式连接数据库