A World Final? World Cup! (I)
题目
https://ac.nowcoder.com/acm/contest/46800/A
附图
思路
写的一般,参考即可
思路是
分别记录双方赢的场次
1.当双方比分差距超过3就没必要比了,直接结束
2.计算如果一方赢下接下来的所有比赛能不能赶上甚至超过对方,如果可以,继续执行循环;不行的话直接结束比赛
所有比赛结束,双方比分相等的话就打平,输出-1就行
参考代码c++
#include <iostream>
using namespace std;
int main() {
int t,m,n,flag,mm,nn;
string a;
cin>>t;
while(t--){
m=0;n=0;flag=0;mm=0;nn=0;
cin>>a;
for(int i=0;i<=9;i++){
if(i%2==0){
if(a[i]=='1'){
m++;
}
mm++;
}else{
if(a[i]=='1'){
n++;
}
nn++;
}
if((m-n>=3||n-m>=3)&&i%2==1){
flag=i+1;
break;
}
if(m>n+5-nn||n>m+5-mm){
flag=i+1;
break;
}
}
if(m==n){
cout<<"-1"<<endl;
}else if(flag!=0){
cout<<flag<<endl;
}
}
}
D 现在是,学术时间 (II)
题目
https://ac.nowcoder.com/acm/contest/46800/D
附图(点击查看大图)
思路
这题没啥花里胡哨的
就是计算面积时注意别写错符号变量啥的
思路是
矩形面积=长*宽(长:x大-x小 ; 宽:y大-y小)
不想判断哪个变量大还是小就活用max()min()函数,或者直接相减时用绝对值abs()函数
两矩形并集面积得算 (可以看下我代码,这里容易写乱)
两矩形交集面积为两矩形面积之和减去并集面积 s1+s2-s并
第二个矩形未知点的选取是第一个矩形其中的一个端点
至于选取哪个,写数组把四个端点记录下来,用一个变量每次比较判断一下结果就行(我没用max变量,会与max函数冲突)
参考代码c++
#include <bits/stdc++.h>
using namespace std;
int main() {
int x, y, xp, yp, t, s1, s2, s3, s4, s5;
double res, max1;
cin>>t;
while (t--) { // 注意 while 处理多个 case
cin >> x >> y >> xp >> yp;
max1=0;
s1=x*y;
int xm[]={0,0,x,x};
int ym[]={0,y,0,y};
for(int i=0;i<4;i++){
s2=abs(xp-xm[i])*abs(yp-ym[i]);
s3=s1+s2;
s4=abs(min(x,max(xp,xm[i]))-max(min(xp,xm[i]),0))*abs(min(y,max(yp,ym[i]))-max(min(yp,ym[i]),0));
s5=s3-s4;
res=s4*1.0/s5;
if(max1<res){
max1=res;
}
}
cout<<max1<<endl;
}
}
H 本题主要考察了DFS
题目
https://ac.nowcoder.com/acm/contest/46800/H
附图(点击查看大图)
思路
这题也没啥花里胡哨的
不过本人没用DFS
观察题目可以发现所有拼图的1和2缺口的总和数量是一样
思路是记录1和2缺口的数量,然后计算就好
参考代码c++
#include <iostream>
using namespace std;
int main() {
int t, n, a, b, x, y;
string m;
cin>>t;
while(t--){
cin>>n;
x=0;y=0;
n=n*n-1;
while(n--){
cin>>m;
for(int i=0;i<4;i++){
if(m[i]=='1'){
x++;
}else if(m[i]=='2'){
y++;
}
}
}
cout<<10+x-y<<endl;
}
}
K 本题主要考察了dp
题目
https://ac.nowcoder.com/acm/contest/46800/K
附图(点击查看大图)
思路
不过本人没用dp,总结了规律写的
其实思考后可以想出当字符是100100100100...这样时坏区间总数最少,只要考虑最后那段就行,因为前面不存在坏区间
只要考虑字符串最后的情况就行
...100100
...100101
...100111
...101111
大概就这么几种,会发现从某一位置后都是坏区间,只要找准那个位置就可以了
当然切记不要忘了考虑n==m的情况!!!
参考代码c++
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
if(n==m){
cout<<n-2;
}else if((n-1)/3+1>=m){
cout<<0;
}else{
cout<<m-((n-m)/2+1);
}
}