解题报告
2015-12-13 21:20
281 查看
A:http://www.bnuoj.com/bnuoj/problem_show.php?pid=4061
有如下一个函数f,不知道具体的表达式,但知道具有如下的性质
1.定义域是正整数域,值域是整数域.
2.f(1)=0
3.f(2*m)=2*f(m)+1
4.f是严格递增函数,即如果m>n那么f(m)>f(n).
并且我们知道用上面的性质就可以唯一确定f的表达式,现在给你一个正整数x,要求输出对应的函数值f(x)
解:f(1)=0,f(2)=1,f(4)=3.....以此类推,但是不知道f(3)为多少,如果f(3)=0,则不满足第四个条件,所以可以推出输入只有1.2.4.8.16...2^n。很容易得出f(n)=n-1。
B:http://www.bnuoj.com/bnuoj/problem_show.php?pid=4090
直接得到a,b的最大公约数,判断n能否被它整除。
C:http://www.bnuoj.com/bnuoj/problem_show.php?pid=4086
题目不难,但是需要处理很多细节问题,往往字符串的题目都是如此。这题除了要符合题目要求的条件外,还需要判断是否符合变量的命名条件。
D:http://www.bnuoj.com/bnuoj/problem_show.php?pid=4096
对于一个序列a,我们定义它的逆序数为满足a[i]>a[j]且i<j的有序对<i,j>的个数,这样的有序对称为逆序对。
例如 a[0]=1,a[1]=2,a[2]=4,a[3]=5,a[4]=3,存在的逆序对就有<2,4>和<3,4>,其逆序数就是2。
现在,给你一个长为N的序列,要求恰好执行K次交换操作,每次交换只能在相邻的两个数之间进行,问得到的结果序列其逆序数最小和最大可能是多少。
首先得出定理,移动任意相邻两个数字,如果数字不同,逆序数加1或者减1,如果相同,逆序数不变。
在计算最小时:如果当前逆序数比操作数大,直接得出最小为当前逆序数减去操作。反之,则先将逆序数减到0,然后判断剩下的操作数,这时如果有数组中有相同的数字或者操作数剩下为偶数,则输出0,否则输出1;
最大:同理,这时先得出最大可能的逆序数,如果操作数+现有逆序数<最大逆序数,则得出操作数+当前逆序数,反之先将逆序数加到最大,在判断。
有如下一个函数f,不知道具体的表达式,但知道具有如下的性质
1.定义域是正整数域,值域是整数域.
2.f(1)=0
3.f(2*m)=2*f(m)+1
4.f是严格递增函数,即如果m>n那么f(m)>f(n).
并且我们知道用上面的性质就可以唯一确定f的表达式,现在给你一个正整数x,要求输出对应的函数值f(x)
解:f(1)=0,f(2)=1,f(4)=3.....以此类推,但是不知道f(3)为多少,如果f(3)=0,则不满足第四个条件,所以可以推出输入只有1.2.4.8.16...2^n。很容易得出f(n)=n-1。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { int n; while (~scanf("%d",&n)) { printf ("%d\n",n-1); } return 0; }
B:http://www.bnuoj.com/bnuoj/problem_show.php?pid=4090
直接得到a,b的最大公约数,判断n能否被它整除。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int gcd(int a,int b) { if (b==0) return a; return gcd(b,a%b); } int main() { int a,b,n; while (~scanf("%d%d%d",&a,&b,&n)) { if (a==0&&b==0&&n==0) break; int ans=gcd(a,b); if (n%ans==0) printf ("YES\n"); else printf ("NO\n"); } return 0; }
C:http://www.bnuoj.com/bnuoj/problem_show.php?pid=4086
题目不难,但是需要处理很多细节问题,往往字符串的题目都是如此。这题除了要符合题目要求的条件外,还需要判断是否符合变量的命名条件。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { char ch[120]; while(~scanf("%s",ch)) { int flag=0,flag1=0,flag2=0,flag3=0; int len=strlen(ch); if (!(ch[0]>='a'&&ch[0]<='z')) flag3=1; if (ch[len-1]=='_') flag3=1; for (int i=0; i<len; i++) { if(i<len-1&&ch[i]=='_'&&ch[i+1]=='_') flag3=1; if (ch[i]=='_') flag=1; if (ch[i]>='A'&&ch[i]<='Z') flag1=1; if (!(ch[i]=='_'||(ch[i]>='a'&&ch[i]<='z')||(ch[i]>='A'&&ch[i]<='Z'))) flag2=1; } if ((flag==1&&flag1==1)||flag2==1||flag3==1) printf ("Unknown!\n"); else if (flag==1)//判断是否是cpp { for (int i=0; i<len; i++) { if (ch[i]=='_') ch[i+1]=ch[i+1]-32; if (ch[i]!='_') printf ("%c",ch[i]); } printf ("\n"); } else//java的情况 { for (int i=0; i<len; i++) { if (ch[i]>='A'&&ch[i]<='Z') printf ("_%c",ch[i]+32); else printf ("%c",ch[i]); } printf ("\n"); } } return 0; }
D:http://www.bnuoj.com/bnuoj/problem_show.php?pid=4096
对于一个序列a,我们定义它的逆序数为满足a[i]>a[j]且i<j的有序对<i,j>的个数,这样的有序对称为逆序对。
例如 a[0]=1,a[1]=2,a[2]=4,a[3]=5,a[4]=3,存在的逆序对就有<2,4>和<3,4>,其逆序数就是2。
现在,给你一个长为N的序列,要求恰好执行K次交换操作,每次交换只能在相邻的两个数之间进行,问得到的结果序列其逆序数最小和最大可能是多少。
首先得出定理,移动任意相邻两个数字,如果数字不同,逆序数加1或者减1,如果相同,逆序数不变。
在计算最小时:如果当前逆序数比操作数大,直接得出最小为当前逆序数减去操作。反之,则先将逆序数减到0,然后判断剩下的操作数,这时如果有数组中有相同的数字或者操作数剩下为偶数,则输出0,否则输出1;
最大:同理,这时先得出最大可能的逆序数,如果操作数+现有逆序数<最大逆序数,则得出操作数+当前逆序数,反之先将逆序数加到最大,在判断。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; #define ll long long bool cmp(int a,int b) { return a>b; } int main() { int num[1010]; ll n,k; while(~scanf("%lld%lld",&n,&k)) { ll s=0,flag=0; for(int i=1;i<=n;i++) scanf("%d",&num[i]); for(int j=2;j<=n;j++) { for(int i=1;i<j;i++) { if(num[i]>num[j]) s++; if(num[i]==num[j]) flag++; } } if(n==1) { printf("0 0\n"); continue; } //求最小~~~~~~~~~~~~~~ if(s>k) printf("%lld ",s-k); else { int kk=k-s; if(kk%2==0||flag>0) printf("0 "); else printf("1 "); } //求最大~~~~~~~~~~~~~~~ sort(num+1,num+n+1,cmp);//从大到小排序 ll maxx=0; //得到可能的最大逆序数 for(int j=2;j<=n;j++) { for(int i=1;i<j;i++) { if(num[i]>num[j]) maxx++; } } //cout<<maxx<<endl; if(s+k<=maxx) printf("%lld\n",s+k); else { int kk=s+k-maxx; if(kk%2==0||flag>0) printf("%lld\n",maxx); else printf("%lld\n",maxx-1); } } return 0; }
相关文章推荐
- Centos7 readme
- 关于c++提取符号“>>”的重载问题
- C语言知识总结
- leetcode -- Combination -- 重点,求可能的0,1全排列
- [CV] bundler安装
- XSS quiz 6~10解题方案
- Ubuntu下安装matlab应用程序图文教程(详细 全面)
- C#——类和继承
- 杭电Red and Black。。。。水题
- vmware中的3种网络模式:桥接、NAT(地址转换)、host-only
- 二叉排序树
- 创建SSH Key连接github或gitlab
- android:gravity 和 android:layout_gravity 区别
- 创建SSH Key连接github或gitlab
- c语言总结
- 文字检测
- nova http 409 虚拟机状态重置
- [javase学习笔记]-4.4 函数的重载
- 申请内存的函数有哪些
- Q:应用程序无法正常启动(0xc000007b)