A. 金币 - 洛谷 P2669 - Virtual Judge
题意:第一天收到1枚金币,之后的两天每天收到两枚金币,再之后的三天每天收到三枚金币,以此类推,问n天后收到多少金币。
思路:用一个变量w记录次数,q记录当前每天能收到的金币,每天w++,w==q时重置为0,q++
代码:
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 2e3+10;
ll n,m,k;
void sovle(){
cin>>n;
int q=1,w=0;
for(int i=0;i<n;i++){
m+=q;
w++;
if(q==w){
w=0;
q++;
}
}
cout<<m;
}
int main()
{
//ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
//cin>>t;
while (t --){
sovle();
}
return 0;
}
B. 数字游戏 - 洛谷 P5660 - Virtual Judge
题意:问字符串中有几个1
思路:遍历字符串,是1就++
代码
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 2e3+10;
int n,m,k;
void sovle(){
string s;
cin>>s;
for(int i=0;i<s.size();i++){
if(s[i]=='1'){
m++;
}
}
cout<<m;
}
int main()
{
//ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
//cin>>t;
while (t --){
sovle();
}
return 0;
}
C. 标题统计 - 洛谷 P5015 - Virtual Judge
题意:输入一行可能包含大小写字母、数字字符、空格、换行符的字符串,问字符串大小写字母和数字字符的数量
思路:用getline(cin,s)读入一行字符串,遍历字符串,遍历到空格就不操作
代码:
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 2e3+10;
int n,m,k;
void sovle(){
string s;
getline(cin,s);
for(int i=0;i<s.size();i++){
if(s[i]!=' '){
m++;
}
}
cout<<m;
}
int main()
{
//ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
//cin>>t;
while (t --){
sovle();
}
return 0;
}
D. 面积 - 洛谷 P5681 - Virtual Judge
题意:比较给出的正方形和矩形的大小
思路:注意开long long就行
代码:
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 2e3+10;
ll n,m,k;
void sovle(){
cin>>n>>m>>k;
if(n*n>m*k){
cout<<"Alice";
}
else cout<<"Bob";
}
int main()
{
//ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
//cin>>t;
while (t --){
sovle();
}
return 0;
}
E. 接水问题 - 洛谷 P1190 - Virtual Judge
题意:有n个人和m个水龙头,给出每个人的接水量,水龙头每秒供水量为1,只有当前一个人的接水完成时下一个人才能换上,问最少需要多少秒才能完成接水任务
思路:注意只有当一个人完成的时候下一个人才能补上(没看清楚一直WA到最后T_T),读入数组。如果人数小于水龙头数时输出接水量最大的,否则标记一下先让前m个人先接水,标记m+1的位置(就是下一个要接水的位置),当某个人接水完成时令其等于标记位置的接水量(替换那个人)
代码:
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 2e3+10;
ll n,m,k,sum,a[10005];
void sovle(){
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a[i];
}
if(n<=m){
sort(a,a+n,greater<int>());
cout<<a[0];
return;
}
int k=m;
while(k<n+m){
for(int i=0;i<m;i++){
a[i]--;
if(a[i]==0){
a[i]=a[k];
k++;
}
}
sum++;
}
cout<<sum;
}
int main()
{
//ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
//cin>>t;
while (t --){
sovle();
}
return 0;
}
F. 优秀的拆分 - 洛谷 P7071 - Virtual Judge
题意:给出一个数,询问这个数能被哪些二次幂的数相加而成,如果能,从大到小输出那些数,如果不能输出-1.
思路:比较简单的按位拆分和位运算题目(想到的话)。很明显,如果输入的数为奇数一定不能被组成。输入的数为n,i=64开始递减1,如果(n>>i)&1如果为1(n右移i次也就是n除2 i次如果为1,则2的i次方是组成n的数之一)输出。
代码:
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 2e5+10;
ll n, m, k;
void sovle(){
cin>>n;
if(n%2){
cout<<"-1";
}
else{
for(int i=32;i>0;i--){
if(n>>i&1){
cout<<(1<<i)<<' ';
}
}
}
}
int main()
{
//ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
//cin>>t;
while (t --){
sovle();
}
return 0;
}
G. 扫雷游戏 - 洛谷 P2670 - Virtual Judge
题意:问非地雷格周围八个方向有几个地雷。
思路:遍历地图,遇到非地雷格就查找周围的八个方向(注意特判有没有出边界),开方向数组会比较方便查找。
代码:
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 2e5+10;
int n, m, k,dx[8]={0,1,0,-1,-1,1,1,-1},dy[8]={1,0,-1,0,1,1,-1,-1};
void sovle(){
cin>>n>>m;
char a[105][105];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
int sum=0;
if(a[i][j]=='*') {cout<<'*';continue;}
for(int k=0;k<8;k++){
int x=dx[k]+i;
int y=dy[k]+j;
if(a[x][y]=='*'&&x>=0&&x<n&&y>=0&&y<m){
sum++;
}
}
cout<<sum;
}
cout<<endl;
}
}
int main()
{
//ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
//cin>>t;
while (t --){
sovle();
}
return 0;
}
H. 字符串的展开 - 洛谷 P1098 - Virtual Judge
题意:给定一个仅由数字、小写字母和减号-组成的字符串,类似d-h,4-8的字符串为简写,可能需要进行展开。
具体规则如下:减号同为小写字母或数字,且按字典序左边小于右边。输入三个数p1,p2,p3
1.若输入的p1为1,字母子串的减号替换为小写字母,p1为2,字母子串替换为大写字母,上述两种情况的数字子串替换方式不变,p1为3,则两者都替换为等量的字符*
2.若输入的p2表示替换的同一字符重复次数,如p2=2时d-h替换为deeffggh
3.若输入的p3为1,则被替换的字符正序输出,若p3=2,按逆序输出,例如当 p1=1、p2=2、p3=2时,子串 d-h
应扩展为 dggffeeh。
特殊的,若减号右边正好是左边的后继,只删除减号,如d-e输出de。如果减号右边字典序小于等于左边,输出保留减号。
思路:
不需要替换直接输出的情况:1.减号右边小于等于左边的字典序2.两边不同时是字母或数字
不替换但删除减号的情况:减号右边字典序为左边字典序+1
需要展开的时,用一个字符数组储存需要替换的字符,每个储存p2次,最后判断顺序还是逆序
特别的,连续个-号时保留输出。
代码:
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 2e5+10;
int n, m, k,p1,p2,p3;
char a[1000000];
void sovle(){
cin>>p1>>p2>>p3;
cin>>a;
for(int i=0;i<strlen(a);i++)
{
if(a[i]=='-'&&((a[i+1]>='0'&&a[i+1]<='9'&&a[i-1]>='0'&&a[i-1]<='9'&&a[i+1]>a[i-1])||(a[i+1]>='a'&&a[i+1]<='z'&&a[i-1]>='a'&&a[i-1]<='z'&&a[i+1]>a[i-1])))
{
char s[1000000];
int o=0;
for(int j=a[i-1]+1;j<a[i+1];j++)
{
if(p1==3)
for(int k=1;k<=p2;k++)
s[++o]='*';
else if(p1==1||(j>='0'&&j<='9'))
for(int k=1;k<=p2;k++)
s[++o]=j;
else if(p1==2)
for(int k=1;k<=p2;k++)
s[++o]=j-32;
}
if(p3==1)
for(int j=1;j<=o;j++)
cout<<s[j];
else
for(int j=o;j>=1;j--)
cout<<s[j];
}
else cout<<a[i];
}
}
int main()
{
//ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
//cin>>t;
while (t --){
sovle();
}
return 0;
}
I. 格雷码 - 洛谷 P5657 - Virtual Judge
题意:给出格雷码二进制串排序法,要求相邻的两位二进制串刚好有一个位置不同,最后一个与第一个二进制串也算相邻,问n位格雷码的第k位的二进制串。
思路:通过模拟推到,我们可以发现有这样的一个规律,第k位二进制串与k的异或值刚好是k/2,k^k^a=a,因此第k位二进制串可以由k^(k>>1)得到,特别的,这题数据范围到了2的64次方,所以得开unsigned long long。
代码:
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 2e5+10;
int a[66],i;
unsigned long long k,m,n,l;
void sovle(){
cin>>n>>k;
l=(k>>1);
m=l^k;
while(m!=0){
a[i++]=(m&1);
m=(m>>1);
}
for(i=n-1;i>=0;i--){
cout<<a[i];
}
}
int main()
{
//ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
//cin>>t;
while (t --){
sovle();
}
return 0;
}
K. 海港 - 洛谷 P2058 - Virtual Judge
题意:给出n条船的信息,包括到达时间,船上人员个数,船上人员的国籍,问每辆船到达时的前内24小时有多少个国籍的人到达(包括他本身)
思路:用a数组储存国籍信息,book数组储存该国籍的人数,队列queue储存到达时间,输入时若当前国籍没出现过则sum++,若时间大于24小时则当前人员国籍数--,同时队列弹出当前时间,若当前国籍人数为0则sum--
代码:
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 2e5+10;
int n,t,k,book[100005],a[300005],sum,num,head;
queue<int>v;
void sovle(){
cin>>n;
for(int i=0;i<n;i++){
cin>>t>>k;
for(int j=0;j<k;j++){
cin>>a[sum];
v.push(t);
if(book[a[sum++]]++==0){
num++;
}
}
while(t-v.front()>=86400){
v.pop();
if(--book[a[head++]]==0){
num--;
}
}
cout<<num<<endl;;
}
}
int main()
{
//ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
//cin>>t;
while (t --){
sovle();
}
return 0;
}