01.30补题
题意:总共n分,一个人先拿每次拿走k,另一个人拿走剩下的10%,问第一个人拿走至少一半,这样最小的k是多少
思路:二分进行模拟寻找
思考:1)一开始想模拟但是数的范围实在是太大了,难以想到二分,毕竟次数是固定的;2)越小的k和越大的k是两种截然不同的情况,体现在两个人拿的多少,体现在一个人身上是这个人递增或递减的多少,写代码时一定要分清
代码:
1 #include<algorithm> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<iostream> 6 using namespace std; 7 int maxx=1e5+10; 8 int main(){ 9 long long int sum=0; 10 scanf("%lld",&sum); 11 int num=1; 12 long long int left=1,right=sum; 13 while(left<right){ 14 long long int a=0,b=0; 15 long long int s=sum,i=(left+right)/2; 16 int flag1=0; 17 while(1){ 18 19 if(s==0){ 20 break; 21 } 22 if(s!=0&&s>=i){ 23 a+=i; 24 s-=i; 25 }else if(s!=0&&s<i){ 26 a+=s; 27 s=0; 28 } 29 if(s!=0&&s/10!=0){ 30 b+=s/10; 31 s-=s/10; 32 } 33 } 34 if(a>=(sum+1)/2){ 35 flag1=1; 36 }else{ 37 flag1=2; 38 } 39 40 /*if(left==right&&flag1==1){ 41 num=left; 42 break; 43 }*/ 44 if(flag1==1){ 45 right=i; 46 }else if(flag1==2){ 47 left=i+1; 48 }//一直认为先出现a》b 49 50 //printf("%lld %lld\n",left,right); 51 } 52 // printf("%lld:%d ",sum,num+1); 53 printf("%lld\n",left); 54 }
题意:给出一个2*n的棋盘格,部分格子可能已经放了棋子了,问最多能放几个L形的标记(可以旋转90°、180°、270°)
思路:直接寻找就行
思考:1)读题的时候因为是最后了就不太想读了,这种事情以后真的要完全杜绝;2)因为题意没有读懂,又看到这是个后面的题,也就没有仔细研究,其实这个题很简单
代码:
1 #include <iostream> 2 3 using namespace std; 4 5 int main() 6 { 7 string s1,s2; 8 cin >> s1 >> s2; 9 int result = 0 ; 10 for (int i = 0 ; i+1 < s1.size() ; i ++ ) 11 { 12 if(s1[i] == '0' && s1[i+1] == '0' && s2[i] == '0') s1[i]=s1[i+1]=s2[i]='X',result ++ ; 13 else if(s1[i] == '0' && s1[i+1] == '0' && s2[i+1] == '0') s1[i]=s1[i+1]=s2[i+1]='X',result ++ ; 14 else if(s1[i+1] == '0' && s2[i] == '0' && s2[i+1] == '0') s1[i+1]=s2[i]=s2[i+1]='X',result ++ ; 15 else if(s1[i] == '0' && s2[i] == '0' && s2[i+1] == '0') s1[i]=s2[i]=s2[i+1]='X',result ++ ; 16 } 17 cout << result << endl; 18 return 0; 19 }

浙公网安备 33010602011771号